最近在做的项目中使用AVPlayer进行视频播放,因为第一次做功能点这样庞大的视频播放项目,所以在带着团队review代码的时候发现有些地方还是值得优化的,很经典的一块就是按照集数顺序播放,当时做的是思路如下:
AVPlayer
1.为当前
AVPlayerItem
添加播放结束的通知AVPlayerItemDidPlayToEndTimeNotification
;
//监听视频是否已经播放完毕,然后实现KVO的方法:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];
2.实现监听方法
//视频播放结束通知
- (void)mediaPlayDidEnd:(NSNotification *)notification{
//在此实现切换相应集数的逻辑,例如:刷新UI、切换播放地址等
}
review代码的时候一不小心点到官方API里面,发现一个神奇的字眼queue,给我的直觉就是队列播放,仔细阅读官方文档后内心感觉这玩意简直就是为自己量身打造的,无比激动 ——AVQueuePlayer
AVQueuePlayer
下面我根据官方文档简单进行翻译下,就不上代码了,因为文档很简单,功能很直白
AVQueuePlayer is a subclass of [AVPlayer](https://developer.apple.com/reference/avfoundation/avplayer?language=objc) used to play a number of items in sequence. Using this class you can create and manage a queue of player items comprised of local or progressively downloaded file-based media, such as QuickTime movies or MP3 audio files, as well as media served using HTTP Live Streaming.
AVQueuePlayer是AVPlayer被用来依次播放的子类。用这个类你能够创建和管理一个播放或文件下载的队列,例如QuickTime格式的视频或MP3音频文件,同样还支持流媒体的使用。
- 创建队列对象的方法有两种,都是根据数组创建的,数组元素类型是
AVPlayerItem
:
+ (instancetype)queuePlayerWithItems:(NSArray<AVPlayerItem *> *)items;
- (AVQueuePlayer *)initWithItems:(NSArray<AVPlayerItem *> *)items;
- 获取当前存在于队列里元素的方法
- (NSArray<AVPlayerItem *> *)items;
- 结束当前播放并播放下一集(将当前item从队列中移除)
- (void)advanceToNextItem;
- 判断是否能够在队列中追加播放资源(需要注意的是,不支持队列中存在多个相同的播放资源,即
AVPlayerItem*
)
- (BOOL)canInsertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem;
- 在指定位置插入一条播放资源(如果元素是空的则自动会过滤掉)
- (void)insertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem;
- 从队列中移除播放资源(如果移除的是当前正在播放的元素,则会自动执行
advanceToNextItem
播放下一集)
- (void)removeItem:(AVPlayerItem *)item;
- 清除所有播放资源(当执行这一操作后,将会暂停播放)
- (void)removeAllItems;
以上就是AVQueuePlayer相关的介绍,使用它可以平滑的进行连续播放。
等以后有时间了,将会把播放器这块代码整理下和大家共享(需要和公司申请)~~