在开发中,单纯使用AVPlayer类是无法显示视频的,要将视频层添加至AVPlayerLayer中,这样才能将视频显示出来。
属性含义:
/* 播放器 */
@property (nonatomic, strong) AVPlayer *player;
// 播放器的Layer
@property (weak, nonatomic) AVPlayerLayer *playerLayer;
//生成layer层
AVPlayerLayer * layer=[AVPlayerLayer playerLayerWithPlayer:_player];
//设置坐标
layer.frame=CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
//把layer层加入到self.View中
[self.view.layer addSublayer:layer];
[_player play];
//kvo 观察播放状态playerItem.status
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//观察缓存现在的进度,KVO进行观察,观察 playerItem.loadedTimeRanges的属性[_playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
使用 AVPlayer 的时候,一定要注意 AVPlayer 、 AVPlayerLayer 和 AVPlayerItem 三者之间的关系。
AVPlayer 负责控制播放, layer 显示播放, item 提供数据,当前播放时间, 已加载情况。
Item 中一些基本的属性, status, duration, loadedTimeRanges, currentTime(当前播放时间)。
AVPlayerItemStatus是代表当前播放资源item 的状态(可以理解成这url链接or视频文件。。。可以播放成功/失败)
AVPlayerStatus是代表当前播放器的状态。
addPeriodicTimeObserverForInterval
给AVPlayer 添加time Observer 有利于我们去检测播放进度
但是添加以后一定要记得移除,其实不移除程序不会崩溃,但是这个线程是不会释放的,会占用你大量的内存资源
CMTime 结构体
连接的教程里面 给的参数是CMTimeMake(1, 1),其实就是1s调用一下block,
打个比方CMTimeMake(a, b)就是a/b秒之后调用一下block
介绍一个网站有关这个结构体的:
https://zwo28.wordpress.com/2015/03/06/%E8%A7%86%E9%A2%91%E5%90%88%E6%88%90%E4%B8%ADcmtime%E7%9A%84%E7%90%86%E8%A7%A3%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%88%A9%E7%94%A8cmtime%E5%AE%9E%E7%8E%B0%E8%BF%87%E6%B8%A1%E6%95%88%E6%9E%9C/
拖动slider 播放跳跃播放,要使用AVPlayer 对象的seekToTime:方法,
举个最简单的例子:假如一个video视频有20s,想要跳到10s进行播放(_palyer 为AVPlayer 对象)
[_player seekToTime:CMTimeMake(10,1)];
后面的参数写1,前面的参数写将要播放的秒数,我试验得出的结果,不要问我问什么,需要自己理解。
5.播放到结尾怎么回到开头呢?
[_player seekToTime:kCMTimeZero];
-(void)setupUI{
//创建播放器层
AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:self.player];
playerLayer.frame=aview.frame;
playerLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;//视频填充模式
[aview.layer addSublayer:playerLayer];
}
-(void)addNotification{
//给AVPlayerItem添加播放完成通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}
AVPlayerItem 使用
1. 初始化
playerItemWithURL
或者 initWithURL:
在使用 AVPlayer 播放视频时,提供视频信息的是 AVPlayerItem,一个 AVPlayerItem 对应着一个URL视频资源。
初始化一个 AVPlayItem 对象后,其属性并不是马上就可以使用。我们必须确保 AVPlayerItem 已经被加载好了,可以播放了,才能使用。 毕竟凡是和网络扯上关系的都需要时间去加载。 那么,什么时候属性才能正常使用呢。 官方文档给出了解决方案:
-
直到 AVPlayerItem 的
status
属性为AVPlayerItemStatusReadyToPlay
. -
使用 KVO 键值观察者,其属性。
因此我们在使用的时候,使用 URL 初始化 AVPlayerItem 后,还要给它添加观察者。
2. 添加观察者
AVPlayreItem 的属性需要当 status 为 ReadyToPlay 的时候才可以正常使用。
观察status属性
[_playerItem addObserver:self forKeyPath:@"status" options:(NSKeyValueObservingOptionNew) context:nil]; // 观察status属性,
播放步骤
1. 布局页面,初始化 AVPlayer 和 AVPlayerLayer
// setAVPlayer self.player = [[AVPlayer alloc] init]; _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player]; [self.playerView.layer addSublayer:_playerLayer];