Media Assets, Playback, and Editing 访问和检查媒体资源; 队列媒体用于播放和自定义播放行为; 编辑和组合资源; 导入和导出原始媒体流。
1、媒体资源
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
的tracks
属性检索资源的轨道集合。在许多情况下,需要对资源轨道的子集执行操作,而不是对其完整集合执行操作:在这些情况下,AVAsset
还提供了基于标识符,媒体类型或特征等标准来检索轨道子集的方法。
AVAsset
资源库里的资源;
AVAssetTrac
资源的轨道;
1.2、处理资源
检索要用于回放的资源或获取有关资源的信息:例如,资产的播放时间。
1.2.1、资源信息
AVAssetCache 继承自NSObject
,用于检查本地缓存的媒体资源。iOS 10
之后,可以使用AVAssetDownloadURLSession
和AVAssetDownloadTask
类将HTTP Live Streaming资源下载到iOS设备。可以使用下载资源关联的AVAssetCache
检查其本地缓存的媒体数据
/* 是否离线播放AVAsset
* 在离线播放之前查询此值,确定它是否可供使用。
* YES并不代表所有资源的相关媒体选择选项都可以离线播放。
* 调用- mediaSelectionOptionsInMediaSelectionGroup:确定哪些媒体选择选项可以离线播放。
*/
@property(nonatomic, readonly, getter=isPlayableOffline) BOOL playableOffline;
//查询可用于离线播放本地缓存的媒体选项。
- (NSArray *)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、媒体合成与编辑
将多个音频和视频轨道合成单个组合;编辑电影。
2.1、媒体合成
AVComposition 继承自AVAsset
,将来自多个基于源文件的媒体数据组合在一起显示,或处理来自多个源媒体数据。
在其顶层,AVComposition
是轨道的集合,每个轨道根据时间表呈现特定媒体类型的媒体:例如音频或视频。每个轨道由AVCompositionTrack
的实例表示。每个轨道由一系列轨道片段组成,由AVCompositionTrackSegment
实例表示。每个片段存储由URL、轨道标识符和时间映射指定的源容器中的一部分媒体数据。 URL指定源容器,轨道标识符指示要呈现的源容器的轨道。无论容器类型如何,所有基于文件的视听Asset
都可以组合在一起。
时间映射指定要呈现的源轨道的时间范围,并且还指定其在合成轨道中的呈现的时间范围。如果时间映射的源和目标范围的时长相同,则片段的媒体数据将以其自然速率呈现。否则,该段将以与 source.duration/target.duration
之比相等的速率呈现。
可以使用AVCompositionTrack
的segments
属性访问轨道的轨道片段。具有每个媒体类型信息的轨道集合,以及每个包含其轨道片段数组(URL、音轨标识符和时间映射)的轨道,构成了组合的完整低级表示。这种表示可以由客户端以任何方便的形式写出,随后可以通过使用适当媒体类型的AVMutableCompositionTrack
对象实例化新的AVMutableComposition
来,每个对象的segment
属性根据存储的URL数组、跟踪标识符和时间映射设置,从而重新组合。
AVMutableComposition
和AVMutableCompositionTrack
也提供了构建组合的高级接口,提供插入、删除和缩放操作,而无需直接操作合成轨道的trackSegment
数组。这个接口使用更高级的结构,如AVAsset
和AVAssetTrack
,允许客户端使用与它创建的候选源相同的引用,以便在合成之前检查或预览它们。
AVMutableComposition 继承自AVComposition
,用于从现有Asset
创建新合成的可变对象。该类提供了添加和删除轨道的功能,可以添加、删除和缩放时间范围。可以对一个可变组合做一个不可变的快照,以便回放或检查。
AVCompositionTrack 继承自AVAssetTrack
,该轨道由媒体类型,轨道标识符和轨道片段组成。
AVMutableCompositionTrack 继承自AVCompositionTrack
,合成对象中的可变轨道,用于插入,移除和缩放轨道片段,而不会影响其低级别表示。
AVCompositionTrack
定义了轨道段时间对齐的约束。如果在可变组合中设置轨道段数组,则可以使用-validateTrackSegments:error:
测试这些段是否满足约束条件。
AVCompositionTrackSegment 继承自AVAssetTrackSegment
,AVAssetTrack
的一个片段,由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、处理元数据
3.1、检索元数据
检索并过滤与asset
关联的所有元数据。
媒体容器格式存储有关其媒体的描述性元数据。作为开发人员,处理元数据常常很有挑战性,因为每种容器格式都有自己独特的元数据格式。通常,对格式有所理解才能读取和编写容器的元数据,但是AVFoundation
通过使用AVMetadataItem
类简化了对元数据的处理。
在最基本的形式中,AVMetadataItem
的实例是一个键值对,表示单个元数据值,例如电影的标题或专辑的插图。与AVAsset
提供媒体的规范化视图相同,AVMetadataItem
也提供相关元数据的规范化视图。
3.1.1、加载asset的元数据
通过查询asset
的availableMetadataFormats
属性确定其包含的元数据格式。此属性为其包含的每个元数据格式返回一个字符串标识符数组。然后调用-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 *metadataItem = [asset metadataForFormat:obj];
//处理特定格式的元数据集合
}];
}
}];
3.1.2、过滤元数据集合
检索完元数据集合后,下一步是查找指定值。使用AVMetadataItem
的各种类方法来将元数据集合过滤到一组离散值。
查找指定元数据项的最简单方法是按标识符进行筛选,标识符将字典和键分组到一个单元中。以下示例显示如何从公共键空间检索标题项:
NSArray *commonMetadata = asset.commonMetadata;
AVMetadataIdentifier titleID = AVMetadataCommonIdentifierTitle;
NSArray *titleItems = [AVMetadataItem metadataItemsFromArray:commonMetadata filteredByIdentifier:titleID];
AVMetadataItem *titleItem = titleItems.firstObject;
if (titleItem) {
//处理标题项
}
AVMetadataItem
的过滤方法返回项的集合,而不是单个实例。在许多情况下,返回的集合包含单个元素,但如果媒体包含本地化元数据,或者正在从公共键空间检索数据,并且多个键空间中存在相同的值,则返回一个与每个区域设置或键空间匹配的不同值。
3.1.3、查找指定值
在检索了特定的元数据项之后,下一步是调用它的value
属性。返回的值是采用NSObject
和NSCopying
协议的对象类型。可以手动将值转换为适当的类型,但是使用元数据项的类型强制属性更安全也更容易。可以使用它的stringValue
、numberValue
、dateValue
和dataValue
属性轻松地将值强制转换为适当的类型。例如,下面展示了如何检索与iTunes音乐音频轨道相关联的原图:
NSArray *commonMetadata = asset.commonMetadata;
//过滤元数据以查找asset的原图
NSArray *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
支持的元数据格式、元数据键和元数据键空间的详细信息可以在AVMetadataKeySpace
和AVMetadataKey
中找到。
要懒加载元数据项的值,可以使用AVAsynchronousKeyValueLoading
协议中的方法异步加载。AVAsset
类和其他类依次懒地提供它们的元数据,从这些数组中获取对象,而不会对最终未检查的项造成开销。
要过滤元数据项的数组,可以使用此类的方法。例如,按键和键空间、区域设置和首选语言进行过滤。
3.3、
AVMutableMetadataItem 继承自AVMetadataItem
,与视听asset
或其中一个轨道相关联的元数据项。可以从现有的AVMetadataItem
对象或使用元数据项的一个或多个基本属性(键、键空间、语言设置)初始化可变元数据项。
AVMetadataGroup 继承自NSObject
,与时间轴段关联的元数据项的集合。
AVDateRangeMetadataGroup 继承自AVMetadataGroup
,在指定日期范围内有效使用的元数据项集合。
AVTimedMetadataGroup 继承自AVMetadataGroup
,在指定时间范围内有效使用的元数据项集合。例如,AVTimedMetadataGroups
用于表示章节,可选地包含章节标题和章节图像的元数据项。
AVMutableTimedMetadataGroup 继承自AVTimedMetadataGroup
,在指定时间范围内有效使用的元数据项集合。
AVMetadataItemFilter 继承自NSObject
,从元数据项筛选指定信息。
AVMetadataItemValueRequest 继承自NSObject
,用于响应以加载元数据项值的请求。
AVMetadataFormat 定义的元数据格式。
4、媒体播放
4.1、响应播放状态变化
AVPlayer
和AVPlayerItem
的状态经常变化,使用KVO观察和响应这些状态变化。
4.1.1、监听播放状态
监听AVPlayerItem
的status
属性,该属性指示AVPlayerItem
是否已准备好播放。首次创建AVPlayerItem
时,其状态值为AVPlayerItemStatusUnknown
,表示其媒体尚未加载或已排入队列进行播放。当AVPlayerItem
与AVPlayer关联时,它会立即开始排队该项的媒体并准备播放。当状态值更改为AVPlayerItemStatusReadyToPlay
时,AVPlayerItem
即可使用。以下示例展示了如何监听这种状态变化:
{
AVAsset *_asset;
AVPlayerItem *_playerItem;
AVPlayer *_player;
}
int playerItemContext = 0;
- (void)prepareToPlay
{
NSURL *url = [NSURL fileURLWithPath:@""];
NSArray *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:
方法注册监听playerItem
的status
属性。在将playerItem
与player
联系之前调用此方法,以监听status
属性所有状态更改。
4.1.2、响应状态改变
我们已经注册监听playerItem
的status
属性,只要状态值发生变化,就会调用-observeValueForKeyPath:ofObject:change:context:
方法。我们可以在该方法做一些操作:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)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];
}
}
在该方法中获取playerItem
的status
值,如果状态值是AVPlayerItemStatusReadyToPlay
,那么可以播放了。如果在尝试加载playerItem
的媒体时遇到问题,则状态值为AVPlayerItemStatusFailed
。如果发生故障,可以通过查询playerItem
的error
属性来检索失败的详细信息。
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 *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、快速跳转到指定时间
可以使用AVPlayer
和AVPlayerItem
的方法以多种方式查找。最常见的方法是使用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
,用于创建示例数据文件。