AVFoundation – AVQueuePlayer 播放多个媒体文件

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods


一.前言

1.AVAsset

Assets 可以来自一个文件或用户的相册,可以理解为多媒体资源,通过 URL 作为一个 asset 对象的标识. 这个 URL 可以是本地文件路径或网络流;


2.AVAssetTrack

AVAsset 包含很多轨道 AVAssetTrack 的结合,如 audio, video, text, closed captions, subtitles…


3.AVComposition / AVMutableComposition

使用 AVMutableComposition 类可以增删 AVAsset 来将单个或者多个 AVAsset 集合到一起,用来合成新视频。除此之外,若想将集合到一起的视听资源以自定义的方式进行播放,需要使用 AVMutableAudioMix 和 AVMutableVideoComposition 类对其中的资源进行协调管理;


4.AVMutableVideoComposition

AVFoundation 类 API 中最核心的类是 AVVideoComposition / AVMutableVideoComposition 。

AVVideoComposition / AVMutableVideoComposition 对两个或多个视频轨道组合在一起的方法给出了一个总体描述。它由一组时间范围和描述组合行为的介绍内容组成。这些信息出现在组合资源内的任意时间点。

AVVideoComposition / AVMutableVideoComposition 管理所有视频轨道,可以决定最终视频的尺寸,裁剪需要在这里进行;


5.AVMutableCompositionTrack

多个 AVAsset 集合到一起合成新视频中轨道信息,有音频轨、视频轨等,里面可以插入各种对应的素材(画中画,水印等);


6.AVMutableVideoCompositionLayerInstruction

AVMutableVideoCompositionLayerInstruction 主要用于对视频轨道中的一个视频处理缩放、模糊、裁剪、旋转等;


7.AVMutableVideoCompositionInstruction

表示一个指令,决定一个 timeRange 内每个轨道的状态,每一个指令包含多个 AVMutableVideoCompositionLayerInstruction ;而 AVVideoComposition 由多个 AVVideoCompositionInstruction 构成;

AVVideoCompositionInstruction 所提供的最关键的一段数据是组合对象时间轴内的时间范围信息。这一时间范围是在某一组合形式出现时的时间范围。要执行的组全特质是通过其 AVMutableVideoCompositionLayerInstruction 集合定义的。


8.AVAssetExportSession

AVAssetExportSession 主要用于导出视频;


二.AVPlayer 简介

首先在 iOS 平台使用播放视频,可用的选项一般有这四个,他们各自的作用和功能如下: AVFoundation – AVQueuePlayer 播放多个媒体文件

由此可以看出,如果我们不做直播功能 AVPlayer 就是一个最优的选择;在创建一个播放器之前我们需要先了解一些播放器相关的类


1.AVPlayer

AVPlayer 控制播放器的播放,暂停,播放速度


/*
 播放速度
    rate = 0.5;   // 慢放
    rate = 1.0;   // 正常播放
    rate = 0.0;   // 暂停
    rate = -0.5;  // 倒放
 */
@property (nonatomic) float rate;

注意更改播放速度要在视频开始播放之后才会生效;


2.AVURLAsset

前面文章有对 AVAsset 介绍,AVURLAsset 是 AVAsset 的一个子类,使用 URL 进行实例化,实例化对象包换 URL 对应视频资源的所有信息;


3.AVPlayerItem

AVPlayerItem 管理资源对象,提供播放数据源;


4.AVPlayerLayer

AVPlayerLayer 负责显示视频,如果没有添加该类,只有声音没有画面


三.AVPlayer 实现多个媒体资源播放

《AVPlayerItem 管理资源对象》文章中有对简单播放器做简单详细的讲解,但是 AVPlayer只支持单个媒体资源的播放,如果我们需要播放多个媒体资源应该如何解决呢?

在 AVPlayer 中有个函数可以用于切换不同的 AVPlayerItem 加载的 AVAsset 媒体,声明如下:

//切换新的媒体替换当前媒体
- (void)replaceCurrentItemWithPlayerItem:(nullable AVPlayerItem *)item;

1.AVPlayer 切换播放源方案一

在切换 AVPlayerItem 前要把所有的通知,观察者移除,切换后重新添加; AVFoundation – AVQueuePlayer 播放多个媒体文件


2.AVPlayer 切换播放源方案二

把通知,观察者全部移除,AVPlayer 置为nil,切换不同媒体重新创建 AVPlayer; AVFoundation – AVQueuePlayer 播放多个媒体文件


3.使用 AVPlayer 切换播放源缺点

使用该方法在 AVPlayer 播放多个视频时,是很容易出现性能问题的,切换视频时会存在卡顿现象,尤其在视频内容比较多的时候,无法完美衔接,中间会有一个短暂的停留,这个不太符合我们的需求;


四.AVQueuePlayer 简介

为了解决多个媒体播放问题,可以使用 AVPlayer 的子类 AVQueuePlayer 实现列表播放

//通过给定的AVPlayerItem数组创建一个AVQueuePlayer实例
+ (instancetype)queuePlayerWithItems:(NSArray<AVPlayerItem *> *)items;

//通过给定的AVPlayerItem数组初始化一个AVQueuePlayer实例
- (AVQueuePlayer *)initWithItems:(NSArray<AVPlayerItem *> *)items;

//获取当前播放队列数组
- (NSArray<AVPlayerItem *> *)items;

//停止当前播放的,播放队列中的下一首
- (void)advanceToNextItem;

//判断是否可以插入AVPlayerItem
- (BOOL)canInsertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem;

//往播放队列中插入新的AVPlayerItem
- (void)insertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem;

//移除指定的AVPlayerItem
- (void)removeItem:(AVPlayerItem *)item;

//移除所有播放队列中的AVPlayerItem
- (void)removeAllItems;

五.AVQueuePlayer 实现多个媒体资源播放缺点

对于多个媒体播放,虽然可以使用 AVQueuePlayer 完成,但是官方 API 中没找到播放上一首的方法,只能完成顺序播放,官方 AVQueuePlayer 使用demo 跳转《AVQueuePlayer demo》

至于如何完美解决多媒体播放,可以直接使用 AVFoundation 媒体资源编辑基本类 AVMutableComposition / AVComposition / AVMutableAudioMix 来完成,后面会继续讲解;

AVFoundation 框架中提供了丰富的接口用于视听资源的编辑,其中的关键是 AVComposition ,它将不同的 AVAsset 相结合并形成一个新的 AVAsset 。

使用 AVMutableComposition 类可以增删 AVAsset 来将指定的 AVAsset 集合到一起。除此之外,若想将集合到一起的视听资源以自定义的方式进行播放,需要使用 AVMutableAudioMix 和 AVMutableVideoComposition 类对其中的资源进行协调管理。最终要使用 AVAssetExportSession 类将编辑的内容保存到文件中。


六.猜你喜欢


未经允许不得转载:猿说编程 » AVFoundation – AVQueuePlayer 播放多个媒体文件
喜欢(2) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏