最近在做的项目中使用AVPlayer
进行视频播放,因为第一次做功能点这样庞大的视频播放项目,所以在带着团队review
代码的时候发现有些地方还是值得优化的,很经典的一块就是按照集数顺序播放,当时做的是思路如下:
AVPlayer
为当前
AVPlayerItem
添加播放结束的通知AVPlayerItemDidPlayToEndTimeNotification
1
2//监听视频是否已经播放完毕,然后实现KVO的方法:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];实现监听方法
1
2
3
4//视频播放结束通知
- (void)mediaPlayDidEnd:(NSNotification *)notification{
//在此实现切换相应集数的逻辑,例如:刷新UI、切换播放地址等
}
review
代码的时候一不小心点到官方API里面,发现一个神奇的字眼queue
,给我的直觉就是队列播放,仔细阅读官方文档后内心感觉这玩意简直就是为自己量身打造的,无比激动 ——AVQueuePlayer
AVQueuePlayer
下面我根据官方文档简单进行翻译下,就不上代码了,因为文档很简单,功能很直白
AVQueuePlayer is a subclass of AVPlayer 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
1
2
3+ (instancetype)queuePlayerWithItems:(NSArray<AVPlayerItem *> *)items;
- (AVQueuePlayer *)initWithItems:(NSArray<AVPlayerItem *> *)items;获取当前存在于队列里元素的方法
1
- (NSArray<AVPlayerItem *> *)items;
结束当前播放并播放下一集(将当前item从队列中移除)
1
- (void)advanceToNextItem;
判断是否能够在队列中追加播放资源(需要注意的是,不支持队列中存在多个相同的播放资源,即
AVPlayerItem
)1
- (BOOL)canInsertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem;
在指定位置插入一条播放资源(如果元素是空的则自动会过滤掉)
1
- (void)insertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem;
从队列中移除播放资源(如果移除的是当前正在播放的元素,则会自动执行advanceToNextItem播放下一集)
1
- (void)removeItem:(AVPlayerItem *)item;
清除所有播放资源(当执行这一操作后,将会暂停播放)
1
- (void)removeAllItems;
以上就是AVQueuePlayer
相关的介绍,使用它可以平滑的进行连续播放。
等以后有时间了,将会把播放器这块代码(含FFmpeg
)整理下和大家共享(需要和公司申请)~~