本文集主要介绍视频播放相关的知识点,采用的是AVFoundation框架。
播放视频苹果提供了非常强大的AVFoundation框架,几乎可以满足我们所有的需求,播放短视频仅仅需要几行代码就可以搞定。
#import "ViewController.h"
// 导入AVFoundation框架
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *strURL = @"https://www.apple.com/105/media/cn/home/2018/da585964_d062_4b1d_97d1_af34b440fe37/films/behind-the-mac/mac-behind-the-mac-tpl-cn_848x480.mp4";
NSURL *url = [NSURL URLWithString:strURL];
AVURLAsset *asset = [AVURLAsset assetWithURL:url];
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:item];
AVPlayerLayer *avLayer = [AVPlayerLayer playerLayerWithPlayer:player];
avLayer.frame = self.view.bounds;
[self.view.layer addSublayer:avLayer];
// 播放视频
[player play];
}
@end
下文主要是介绍一下视频相关类的作用以及常用接口。
1. AVURLAsset:播放资源
它是AVFoundation的视频资源模型,提供媒体资源的不会随着视频播放变化的信息,例如视频的长度,格式等。虽然AVURLAsset是不可变的,但是它的属性却是异步加载的, 所以它的属性值并不是一直可用的,但是一旦可用了,值就不会再变了。它包含视频资源的音频、视频、字幕等。
2. AVPlayerItem:播放单元
包含媒体资源的动态信息。是否可以播放,播放进度,缓存进度,视频的尺寸,是否播放完,缓冲情况(可以正常播放还是网络情况不好)等。
// 通过一个asset来实例化AVPlayerItem对象,相当于调用[AVPlayerItem playerItemWithAsset:_asset automaticallyLoadedAssetKeys:@[@"duration"]];
+ (instancetype)playerItemWithAsset:(AVAsset *)asset;
// 创建一个AVPlayerItem,将任意属性集委托给该框架,就可以自动载入对应的属性,省去了loadValuesAsynchronouslyForKeys: completionHandler载入需要访问其他资源属性。
+ (instancetype)playerItemWithAsset:(AVAsset *)asset automaticallyLoadedAssetKeys:(nullable NSArray<NSString *> *)automaticallyLoadedAssetKeys ;
// 当暂停的时候,是否可以继续使用网络资源继续缓冲。设置为NO,不可以,可以省电。
// ios9以后默认为NO,iOS9以前默认为YES
@property (nonatomic, assign) BOOL canUseNetworkResourcesForLiveStreamingWhilePaused;
// 设置播放器提前缓冲的时间,以防止播放中断。该属性定义了首选的前向缓冲区持续时间(秒)。如果设置为0,就不缓冲了,会经常卡顿。播放器将为大多数使用情况选择适当的缓冲级别。将此属性设置为较低值会增加播放停顿和重新缓冲的机会,而将其设置为较高值会增加对系统资源的需求;
@property (nonatomic) NSTimeInterval preferredForwardBufferDuration;
3. AVPlayer:播放器
+ (instancetype)playerWithPlayerItem:(nullable AVPlayerItem *)item;
// 播放
- (void)play;
// 暂停
- (void)pause;
// 播放速度,正常是1,小于1就是慢放,大于1就是快放
@property (nonatomic) float rate;
// 当前播放时间
- (CMTime)currentTime;
// iOS10之后的新属性,播放器是否应自动延迟播放以尽量减少停顿
// 设置为NO,解决在新系统下有时会播放不了的问题
@property (nonatomic) BOOL automaticallyWaitsToMinimizeStalling;
// 以下三个接口都是播放跳转
// toleranceBefore和toleranceAfter分别是允许之前和之后误差的时间
// completionHandler 跳转之后的回调
// 调用 - (void)seekToTime:(CMTime)time;也是调用- (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter;,只不过toleranceBefore和toleranceAfter都是kCMTimeZero。
- (void)seekToTime:(CMTime)time;
- (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter;
- (void)seekToTime:(CMTime)time completionHandler:(void (^)(BOOL finished))completionHandler NS_AVAILABLE(10_7, 5_0);
4. AVPlayerLayer:播放器界面
// 是视频适配AVPlayerLayer的方式
// 如果视频和AVPlayerLayer长宽比例不一致,就需要对视频做拉伸。
// 有三个值:AVLayerVideoGravityResizeAspect(视频的长宽比例保持不变拉伸,留空白);AVLayerVideoGravityResizeAspectFill(视频的长宽比例保持不变拉伸,铺满整个AVPlayerLayer,这样视频会有截掉一部分);AVLayerVideoGravityResize(改变视频的长宽比例,铺满整个AVPlayerLayer,这样视频会变形)
// 一般使用AVLayerVideoGravityResizeAspect
@property(copy) AVLayerVideoGravity videoGravity;
以上就是做一个最简单视频播放器的全部代码以及一些常用接口的介绍,但是这远远满足不了视频播放器的需求。还需要:
2.监听视频的播放情况
3.播放多个视频
这些会在以后的文章中介绍。
网友评论