OC之媒体资源的播放与编辑

Media Assets, Playback, and Editing 访问和检查媒体资源; 队列媒体用于播放和自定义播放行为; 编辑和组合资源; 导入和导出原始媒体流。

媒体资源的播放与编辑体系.png

1、媒体资源

媒体资源体系.png
1.1、关于 Asset 模型

Asset如何用作媒体播放器的构建模块?

AVFoundation的许多关键特性和功能与播放和处理媒体资源有关。该框架使用AVAsset类对资源建模,AVAsset类是表示单个媒体资源的抽象不可变类型:它提供了媒体资源的合成视图,对整个媒体的静态方面进行建模。AVAsset的实例可以对基于文件的本地媒体进行建模,例如QuickTime电影或MP3音频文件,但也可以表示从远程主机逐步下载的资源或使用 HTTP Live Streaming (HLS) 流媒体。

AVAsset以两种重要方式简化了与媒体的协作。首先,它与资源格式无关联:提供了一个一致的接口来管理并与媒体交互,而不管其底层类型如何;使用容器格式和编解码器类型的详细信息留给框架,让我们专注于在应用程序中使用这些资源的方式。
其次,它与资源位置无关联:使用媒体的URL创建AVAsset实例。这可以是本地URL:如包含在应用程序包中或文件系统上其他位置的URL;也可以是资源:如存储在远程服务器上的HLS流。在任何一种情况下,AVFoundation都会及时执行有效检索和加载资源所需的工作。
AVAsset独立于资源格式和资源位置,大大简化了使用视听媒体的过程。

AVAsset是一个容器对象,由一个或多个AVAssetTrack实例组成,它为资源的统一类型媒体流建模。最常用的轨道类型是音频轨道和视频轨道,但AVAssetTrack还对其他轨道建模,例如隐藏式字幕,字幕和定时元数据。

AVAsset容器.png

使用AVAssettracks属性检索资源的轨道集合。在许多情况下,需要对资源轨道的子集执行操作,而不是对其完整集合执行操作:在这些情况下,AVAsset还提供了基于标识符,媒体类型或特征等标准来检索轨道子集的方法。

AVAsset 资源库里的资源;

AVAssetTrac资源的轨道;

1.2、处理资源

检索要用于回放的资源或获取有关资源的信息:例如,资产的播放时间。

1.2.1、资源信息

AVAssetCache 继承自NSObject,用于检查本地缓存的媒体资源。iOS 10之后,可以使用AVAssetDownloadURLSessionAVAssetDownloadTask类将HTTP Live Streaming资源下载到iOS设备。可以使用下载资源关联的AVAssetCache检查其本地缓存的媒体数据

/* 是否离线播放AVAsset
* 在离线播放之前查询此值,确定它是否可供使用。
* YES并不代表所有资源的相关媒体选择选项都可以离线播放。
* 调用- mediaSelectionOptionsInMediaSelectionGroup:确定哪些媒体选择选项可以离线播放。
*/
@property(nonatomic, readonly, getter=isPlayableOffline) BOOL playableOffline;

//查询可用于离线播放本地缓存的媒体选项。
- (NSArray<AVMediaSelectionOption *> *)mediaSelectionOptionsInMediaSelectionGroup:(AVMediaSelectionGroup *)mediaSelectionGroup;

AVFragmentedAsset : AVURLAsset 可以在不修改先前存在的数据结构的情况下在总持续时间内扩展。

AVFragmentedAssetMinder : NSObject 定期检查是否已将其他fragmentedAsset添加到AVFragmentedAsset。

1.2.2、轨道信息

AVAsynchronousKeyValueLoading 该协议使用资源asset或资源轨道assetTrack而不阻塞调用线程

AVAssetTrackGroup : NSObject asset中的一组相关轨道:一次只能播放其中一个。该数组通常包含相同内容的变体,例如多个翻译中的字幕。通过AVAsset的trackGroups属性来检查asset中包含的轨道组。

AVAssetTrackSegment : NSObject 资源轨道assetTrack的一部分

AVFragmentedAssetTrack : AVAssetTrack 用于处理fragmentedAsset的轨道

1.2.3、检索资源asset

AVURLAsset : AVAsset 用于从本地或远程URL创建资源

AVAssetDownloadURLSession : NSURLSession 用于下载资源

AVAssetResourceLoader : NSObject 协调资源请求:从AVURLAsset对象的resourceLoader属性中获取该对象,并实现AVAssetResourceLoaderDelegate协议;参阅AVARLDelegateDemo

1.3、asset文件导入和导出

从文件夹导入现有媒体数据;将新的、修改的或现有的媒体数据导出到文件夹。

1.3.1、文件导入

AVAssetReader : NSObject 阅读器,用于获取asset的媒体数据,基于文件或由来自多个源媒体数据的集合组成。

1.3.2、文件导出
将视频导出为其他格式

AVAssetExportSession : NSObject 对asset的内容进行编码,以创建指定exportPreset所描述格式的输出

2、媒体合成与编辑

将多个音频和视频轨道合成单个组合;编辑电影。

媒体合成与编辑.png
2.1、媒体合成

AVComposition 继承自AVAsset,将来自多个基于源文件的媒体数据组合在一起显示,或处理来自多个源媒体数据。
在其顶层,AVComposition是轨道的集合,每个轨道根据时间表呈现特定媒体类型的媒体:例如音频或视频。每个轨道由AVCompositionTrack的实例表示。每个轨道由一系列轨道片段组成,由AVCompositionTrackSegment实例表示。每个片段存储由URL、轨道标识符和时间映射指定的源容器中的一部分媒体数据。 URL指定源容器,轨道标识符指示要呈现的源容器的轨道。无论容器类型如何,所有基于文件的视听Asset都可以组合在一起。
时间映射指定要呈现的源轨道的时间范围,并且还指定其在合成轨道中的呈现的时间范围。如果时间映射的源和目标范围的时长相同,则片段的媒体数据将以其自然速率呈现。否则,该段将以与 source.duration/target.duration之比相等的速率呈现。
可以使用AVCompositionTracksegments属性访问轨道的轨道片段。具有每个媒体类型信息的轨道集合,以及每个包含其轨道片段数组(URL、音轨标识符和时间映射)的轨道,构成了组合的完整低级表示。这种表示可以由客户端以任何方便的形式写出,随后可以通过使用适当媒体类型的AVMutableCompositionTrack对象实例化新的AVMutableComposition来,每个对象的segment属性根据存储的URL数组、跟踪标识符和时间映射设置,从而重新组合。
AVMutableCompositionAVMutableCompositionTrack也提供了构建组合的高级接口,提供插入、删除和缩放操作,而无需直接操作合成轨道的trackSegment数组。这个接口使用更高级的结构,如AVAssetAVAssetTrack,允许客户端使用与它创建的候选源相同的引用,以便在合成之前检查或预览它们。

AVMutableComposition 继承自AVComposition,用于从现有Asset创建新合成的可变对象。该类提供了添加和删除轨道的功能,可以添加、删除和缩放时间范围。可以对一个可变组合做一个不可变的快照,以便回放或检查。

AVCompositionTrack 继承自AVAssetTrack,该轨道由媒体类型,轨道标识符和轨道片段组成。

AVMutableCompositionTrack 继承自AVCompositionTrack,合成对象中的可变轨道,用于插入,移除和缩放轨道片段,而不会影响其低级别表示。
AVCompositionTrack定义了轨道段时间对齐的约束。如果在可变组合中设置轨道段数组,则可以使用-validateTrackSegments:error:测试这些段是否满足约束条件。

AVCompositionTrackSegment 继承自AVAssetTrackSegmentAVAssetTrack的一个片段,由URL,轨道标识符和从源轨道到合成轨道的时间映射组成。通常使用这个类将AVComposition的低级表示形式保存到选择的存储格式中,并从存储中重新构造它们。

2.2、视频合成

AVVideoComposition 继承自NSObject,用于视频合成;视频合成在其指令的聚合时间范围内的任何时间描述了用于产生对应于该时间的合成视频帧的视频轨道的数量和ID。当使用AVFoundation的内置视频合成器时,AVVideoComposition包含的指令可以为每个视频源指定空间变换,不透明度值和裁剪矩形,并且这些指令可以通过简单的线性渐变功能随时间变化。
通过实现AVVideoCompositing协议,可以实现自己的自定义视频合成程序;自定义视频合成程序在回放和其他操作期间为其每个视频源提供像素缓冲区,并可以对其执行任意图形操作以产生可视输出。

AVMutableVideoComposition 继承自AVVideoComposition,用于视频合成。

AVVideoCompositionInstruction 继承自NSObject,封装了一组操作指令,由AVVideoComposition对象使用这些指令合成视频。

AVMutableVideoCompositionInstruction 继承自AVVideoCompositionInstruction,封装了一组操作指令,由AVVideoComposition对象使用这些指令合成视频。

AVAsynchronousCIImageFilteringRequest 继承自NSObject,使用Core Image过滤器处理AVVideoComposition中的单个视频帧:如添加滤镜、裁剪视频帧等操作。

AVAsynchronousVideoCompositionRequest 继承自NSObject,包含AVVideoComposition渲染输出像素缓冲区信息。

AVVideoCompositionLayerInstruction 继承自NSObject,设置AVVideoComposition中指定轨道的不透明度opacity、旋转矩阵变换transform和裁剪cropping

AVMutableVideoCompositionLayerInstruction 继承自AVVideoCompositionLayerInstruction,设置AVVideoComposition中指定轨道的不透明度opacity、旋转矩阵变换transform和裁剪cropping

AVVideoCompositionCoreAnimationTool 继承自NSObject,将Core Animation合并到AVVideoComposition中。

AVVideoCompositionRenderContext 继承自NSObject,该实例从缓冲池中提供像素缓冲区信息:如大小和缩放。

2.3、编辑movie

AVMutableMovie 继承自AVMovie, 符合QuickTime或基于ISO的媒体文件格式的视听容器。

AVMutableMovieTrack 继承自AVMovieTrack,符合QuickTime或基于ISO的媒体文件格式的轨道。

2.4、混音

AVAudioMix 继承自NSObject,管理混合音频轨道的输入参数;允许在播放或其他操作期间在音频轨道上执行自定义音频处理

AVMutableAudioMix 继承自AVAudioMix,管理混合音轨的输入参数;允许在播放或其他操作期间在音轨上执行自定义音频处理

AVAudioMixInputParameters 继承自NSObject,表示添加到混合音频轨道时应该应用到音频轨道的参数。

AVMutableAudioMixInputParameters 继承自AVAudioMixInputParameters,表示添加到混合音频轨道时应该应用到音频轨道的参数。

3、处理元数据

数据处理体系.png

3.1、检索元数据

检索并过滤与asset关联的所有元数据。

媒体容器格式存储有关其媒体的描述性元数据。作为开发人员,处理元数据常常很有挑战性,因为每种容器格式都有自己独特的元数据格式。通常,对格式有所理解才能读取和编写容器的元数据,但是AVFoundation通过使用AVMetadataItem类简化了对元数据的处理。

在最基本的形式中,AVMetadataItem的实例是一个键值对,表示单个元数据值,例如电影的标题或专辑的插图。与AVAsset提供媒体的规范化视图相同,AVMetadataItem也提供相关元数据的规范化视图。

3.1.1、加载asset的元数据

通过查询assetavailableMetadataFormats属性确定其包含的元数据格式。此属性为其包含的每个元数据格式返回一个字符串标识符数组。然后调用-metadataForFormat:方法检索特定格式的元数据值,如下所示:

NSURL *url = [NSURL fileURLWithPath:@""];
AVAsset *asset = [AVAsset assetWithURL:url];
NSString *formatsKey = @"availableMetadataFormats";
[asset loadValuesAsynchronouslyForKeys:@[formatsKey] completionHandler:^{
   
    NSError *error = nil;
    AVKeyValueStatus status = [asset statusOfValueForKey:formatsKey error:&error];
    if (status == AVKeyValueStatusLoaded) {
        
        [asset.availableMetadataFormats enumerateObjectsUsingBlock:^(AVMetadataFormat  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSArray<AVMetadataItem *> *metadataItem = [asset metadataForFormat:obj];
            //处理特定格式的元数据集合

        }];
        
    }
}];
3.1.2、过滤元数据集合

检索完元数据集合后,下一步是查找指定值。使用AVMetadataItem的各种类方法来将元数据集合过滤到一组离散值。
查找指定元数据项的最简单方法是按标识符进行筛选,标识符将字典和键分组到一个单元中。以下示例显示如何从公共键空间检索标题项:

NSArray<AVMetadataItem *> *commonMetadata = asset.commonMetadata;
AVMetadataIdentifier titleID = AVMetadataCommonIdentifierTitle;
NSArray<AVMetadataItem *> *titleItems = [AVMetadataItem metadataItemsFromArray:commonMetadata filteredByIdentifier:titleID];
AVMetadataItem *titleItem = titleItems.firstObject;
if (titleItem) {
    //处理标题项
}

AVMetadataItem的过滤方法返回项的集合,而不是单个实例。在许多情况下,返回的集合包含单个元素,但如果媒体包含本地化元数据,或者正在从公共键空间检索数据,并且多个键空间中存在相同的值,则返回一个与每个区域设置或键空间匹配的不同值。

3.1.3、查找指定值

在检索了特定的元数据项之后,下一步是调用它的value属性。返回的值是采用NSObjectNSCopying协议的对象类型。可以手动将值转换为适当的类型,但是使用元数据项的类型强制属性更安全也更容易。可以使用它的stringValuenumberValuedateValuedataValue属性轻松地将值强制转换为适当的类型。例如,下面展示了如何检索与iTunes音乐音频轨道相关联的原图:

NSArray<AVMetadataItem *> *commonMetadata = asset.commonMetadata;
//过滤元数据以查找asset的原图
NSArray<AVMetadataItem *> *artworkItems = [AVMetadataItem metadataItemsFromArray:commonMetadata filteredByIdentifier:AVMetadataCommonIdentifierArtwork];
AVMetadataItem *artworkItem = artworkItems.firstObject;
if (artworkItem) {
    //使用NSData的dataValue属性将值强制转换为NSData
    NSData *imageData = [artworkItem dataValue];
    if (imageData) {
        UIImage *image = [UIImage imageWithData:imageData];
        //处理图片
    }else{
        //没有找到图片数据
    }
}

3.2、AVMetadataItem

AVMetadataItem 继承自NSObject,与视听asset或其中一个轨道相关联的元数据项。

要有效地使用AVMetadataItem,需要了解AVFoundation如何组织元数据。为简化查找和过滤元数据项,AVFoundation框架将相关元数据分组到键空间:

  • 指定格式的键空间:该框架定义了许多指定格式的键空间,它们大致与特定容器或文件格式相关,例如QuickTime(Quicktime元数据和用户数据)或MP3(ID3)。但是,单个asset可能包含跨多个键空间的元数据值。要检索asset的特定格式元数据的完整集合,请使用其元数据属性。
  • 共用的键空间:有许多公共元数据值,例如电影的创建日期或描述,可以存在于多个键空间中。为了帮助规范化对此公共元数据的访问,该框架提供了一个公共键空间,可以访问几个键空间共有的有限元数据值集。这使得检索常用元数据变得容易,而无需考虑特定格式。要检索asset的公共元数据集合,请使用其commonMetadata属性。

元数据项的键符合绘制它们的容器格式规范。AVFoundation支持的元数据格式、元数据键和元数据键空间的详细信息可以在AVMetadataKeySpaceAVMetadataKey中找到。
要懒加载元数据项的值,可以使用AVAsynchronousKeyValueLoading协议中的方法异步加载。AVAsset类和其他类依次懒地提供它们的元数据,从这些数组中获取对象,而不会对最终未检查的项造成开销。
要过滤元数据项的数组,可以使用此类的方法。例如,按键和键空间、区域设置和首选语言进行过滤。

3.3、

AVMutableMetadataItem 继承自AVMetadataItem,与视听asset或其中一个轨道相关联的元数据项。可以从现有的AVMetadataItem对象或使用元数据项的一个或多个基本属性(键、键空间、语言设置)初始化可变元数据项。

AVMetadataGroup 继承自NSObject,与时间轴段关联的元数据项的集合。

AVDateRangeMetadataGroup 继承自AVMetadataGroup,在指定日期范围内有效使用的元数据项集合。

AVTimedMetadataGroup 继承自AVMetadataGroup,在指定时间范围内有效使用的元数据项集合。例如,AVTimedMetadataGroups用于表示章节,可选地包含章节标题和章节图像的元数据项。

AVMutableTimedMetadataGroup 继承自AVTimedMetadataGroup,在指定时间范围内有效使用的元数据项集合。

AVMetadataItemFilter 继承自NSObject,从元数据项筛选指定信息。

AVMetadataItemValueRequest 继承自NSObject,用于响应以加载元数据项值的请求。

AVMetadataFormat 定义的元数据格式。

4、媒体播放

媒体播放体系.png
4.1、响应播放状态变化

AVPlayerAVPlayerItem的状态经常变化,使用KVO观察和响应这些状态变化。

4.1.1、监听播放状态

监听AVPlayerItemstatus属性,该属性指示AVPlayerItem是否已准备好播放。首次创建AVPlayerItem时,其状态值为AVPlayerItemStatusUnknown,表示其媒体尚未加载或已排入队列进行播放。当AVPlayerItem与AVPlayer关联时,它会立即开始排队该项的媒体并准备播放。当状态值更改为AVPlayerItemStatusReadyToPlay时,AVPlayerItem即可使用。以下示例展示了如何监听这种状态变化:

{
    AVAsset *_asset;
    AVPlayerItem *_playerItem;
    AVPlayer *_player;
}
int playerItemContext = 0;
 
- (void)prepareToPlay
{
    NSURL *url = [NSURL fileURLWithPath:@""];
    NSArray<NSString *> *requiredAssetKeys = @[@"playable",@"hasProtectedContent"];//要自动加载的asset键
    _asset = [AVAsset assetWithURL:url];
    //使用asset创建一个新的AVPlayerItem
    _playerItem = [AVPlayerItem playerItemWithAsset:_asset automaticallyLoadedAssetKeys:requiredAssetKeys];
    
    //注册监听playerItem的status属性
    [_playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:&playerItemContext];
    //将playerItem与player联系起来
    _player = [AVPlayer playerWithPlayerItem:_playerItem];
}

-prepareToPlay方法通过调用-addObserver:forKeyPath:options:context:方法注册监听playerItemstatus属性。在将playerItemplayer联系之前调用此方法,以监听status属性所有状态更改。

4.1.2、响应状态改变

我们已经注册监听playerItemstatus属性,只要状态值发生变化,就会调用-observeValueForKeyPath:ofObject:change:context:方法。我们可以在该方法做一些操作:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if (context == &playerItemContext) {
        
        if ([keyPath isEqualToString:@"status"]) {
            AVPlayerItemStatus status = [change[NSKeyValueChangeNewKey] integerValue];
            switch (status) {
                case AVPlayerItemStatusReadyToPlay:
                    //playerItem可以播放了。
                    break;
                case AVPlayerItemStatusFailed:
                    //playerItem失败了,查看error
                    break;
                case AVPlayerItemStatusUnknown:
                    //playerItem还没准备好
                    break;
                default:
                    break;
            }
        }
        
    }else{
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

在该方法中获取playerItemstatus值,如果状态值是AVPlayerItemStatusReadyToPlay,那么可以播放了。如果在尝试加载playerItem的媒体时遇到问题,则状态值为AVPlayerItemStatusFailed。如果发生故障,可以通过查询playerItemerror属性来检索失败的详细信息。

4.2、监测播放时间

观察asset的播放时间,以更新AVPlayer的状态。

通常观察asset的播放时间,以便更新进度条或以其他方式同步用户界面的状态。KVO 不适合观察状态持续变化;而AVPlayer提供了两种不同的方式来观察播放时间变化:周期性观察和边界观察。

4.2.1、周期性观察

可以按一定的时间间隔观察时间变化。如果使用自定义player,则周期性观察的最常见用例是更新用户界面中的时间显示。

使用AVPlayer-addPeriodicTimeObserverForInterval:queue:usingBlock:方法观察周期性时间变化;该方法接受一个表示时间间隔的CMTime值、一个串行调度队列和一个在指定时间间隔调用的回调块。以下示例显示如何设置在正常播放期间每半秒调用一次的块:

id _timeObserverToken;

- (void)addPeriodicTimeObserver
{
    // 每半秒通知一次
    CMTime time = CMTimeMakeWithSeconds(0.5, NSEC_PER_SEC);
    _timeObserverToken = [_player addPeriodicTimeObserverForInterval:time queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
        //更新UI
    }];
}

- (void)removePeriodicTimeObserver
{
    if (_timeObserverToken) {
        [_player removeTimeObserver:_timeObserverToken];
        _timeObserverToken = nil;
    }
}
4.2.2、观察边界时间

可以在媒体的时间轴中定义多个监测点,并且框架会在正常播放期间遍历这些时间点并通知我们。边界观测的使用频率低于周期性观测,但在某些情况下仍然有用。例如,如果播放的视频没有一些播放控件(如开关),并且需要同步显示或在遍历那些时间时显示播放控件,则可以使用边界观察。

使用AVPlayer-addBoundaryTimeObserverForTimes:queue:usingBlock:方法观察边界时间。这个方法接受一个NSValue对象数组:包含定义边界时间的CMTime值,一个串行调度队列和一个回调块。下面的例子展示了如何定义四分之一播放的边界时间:

- (void)addBoundaryTimeObserver
{
    //将asset的持续时间划分为四分之一。
    CMTime interval = CMTimeMultiplyByFloat64(_asset.duration, 0.25);
    CMTime currentTime = kCMTimeZero;
    NSMutableArray<NSValue *> *times = [NSMutableArray array];
    CMTimeMinimum(currentTime, _asset.duration);
    while (CMTimeCompare(currentTime, _asset.duration)) {
        currentTime = CMTimeAdd(currentTime, interval);
        [times addObject:[NSValue valueWithCMTime:currentTime]];
    }
    _timeObserverToken = [_player addBoundaryTimeObserverForTimes:times queue:dispatch_get_main_queue() usingBlock:^{
        //更新UI
    }];
}
4.3、查询媒体

查询或取消一个媒体项目,以快速访问指定时间点。

除了正常的线性播放之外,用户还希望能够以非线性的方式查找或删除内容,以便快速获得媒体中各种感兴趣的点。AVKit自动为你提供删除控制(如果媒体支持),但如果正在构建一个自定义播放器,需要我们构建这个特性。即使在使用AVKit的情况下,仍然需要提供一个补充的用户界面,例如表视图或集合视图,允许用户快速跳到媒体中的各个位置。

4.3.1、快速跳转到指定时间

可以使用AVPlayerAVPlayerItem的方法以多种方式查找。最常见的方法是使用AVPlayer-seekToTime:方法,将目标CMTime值传递给它,如下所示:

//查询2分钟的标记
CMTime time = CMTimeMakeWithSeconds(120, 1);
[_player seekToTime:time];

-seekToTime:方法更注重速度而不是精确度。这意味着AVPlayer移动的实际时间可能与请求的时间不同。

4.3.2、准确跳转到指定时间

使用-seekToTime:toleranceBefore:toleranceAfter:方法实现精确的查找,该方法允许指定与目标时间(之前和之后)的容差偏差量;

//在3分25秒标记处寻找第一帧
CMTime seekTime = CMTimeMakeWithSeconds(205, NSEC_PER_SEC);
[_player seekToTime:seekTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

4.4、播放asset

创建音频或视频播放器以播放由playerItem建模的asset

AVPlayer 继承自NSObject,提供界面以控制player的传输行为。

AVQueuePlayer 继承自AVPlayer,按顺序播放多个playerItem。使用此类创建和管理由本地或逐步下载的基于文件的媒体(如QuickTime电影或MP3音频文件)以及使用HTTP Live Streaming提供的媒体组成的playerItem队列。

AVPlayerLayer 继承自CALayer, 管理player画面输出。

AVPlayerItem 继承自NSObject,用于建模player所播放的asset的时间和表示状态。

AVPlayerItemTrack 继承自NSObject,用于修改由player呈现的assetTrack的呈现状态。

AVSynchronizedLayer 继承自NSObject,用于与指定playerItem同步。

AVPlayerItemMetadataCollector 继承自AVPlayerItemMediaDataCollector,用于捕获为HTTP Live Streaming资产定义的日期范围元数据。

AVPlayerMediaSelectionCriteria 继承自NSObject,指定player的首选语言和媒体特性。player在准备和播放playerItem时应尝试自动选择这些选项。语言和媒体特性按优先顺序指定。

AVSampleBufferAudioRenderer 继承自NSObject,用于解压缩音频,播放压缩或未压缩音频。

AVSampleBufferDisplayLayer 继承自CALayer,显示压缩或未压缩视频帧。

AVSampleBufferRenderSynchronizer 继承自NSObject,将多个队列中的样本缓冲区同步到单个时间轴

4.5、播放QuickTime和ISO相关媒体的asset

AVMovie 继承自AVAsset,表示符合QuickTime或基于ISO媒体文件格式的视听容器。

AVMovieTrack 继承自AVAssetTrack,符合QuickTime或基于ISO媒体文件格式的轨道。

AVFragmentedMovie 继承自AVMovie,用于处理片段影片文件。

AVFragmentedMovieTrack 继承自AVMovieTrack,用于处理片段化影片文件轨道。

AVFragmentedMovieMinder 继承自AVFragmentedAssetMinder,用于检查是否已将其他影片片段追加到片段化影片文件中。

AVMediaDataStorage 继承自NSObject,用于创建示例数据文件。

推荐阅读更多精彩内容