【iOS】AVQueuePlayer讲解

最近在做的项目中使用AVPlayer进行视频播放,因为第一次做功能点这样庞大的视频播放项目,所以在带着团队review代码的时候发现有些地方还是值得优化的,很经典的一块就是按照集数顺序播放,当时做的是思路如下:

AVPlayer

  1. 为当前AVPlayerItem添加播放结束的通知AVPlayerItemDidPlayToEndTimeNotification

    1
    2
    //监听视频是否已经播放完毕,然后实现KVO的方法:
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];
  2. 实现监听方法

    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.

翻译:AVQueuePlayerAVPlayer被用来依次播放的子类。用这个类你能够创建和管理一个播放或文件下载的队列,例如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)整理下和大家共享(需要和公司申请)~~