AVFoundation编程指南09-AVAsset解读(上)
写在前面
喜欢AVFoundation资料的同学可以关注我的专题:《AVFoundation》专辑
也可以关注我的简书账号
正文
AVAsset
是一个抽象类,它定义AVFoundation
的定时音视频媒体模型。
每个AVAsset
包含旨在一起呈现或处理的track
集合,每个track
均匀的媒体类型,包括但不限于音频,视频,文本,隐藏式字幕和字幕。
AVAssets
通常通过其具体的子类AVURLAsset
实例化,NSURL
引用音视频媒体asset
,例如流(包括HTTP
实时流),QuickTime
视频文件,MP3
文件和其他类型的文件。
它们也可以使用其他具体子类进行实例化,这些子类以有用的方式扩展视听媒体的基本模型,就像AVComposition
进行时间编辑一样。
整个asset
的属性由AVAsset
定义。另外,可以获得对表示集合的轨道的AVAssetTracks
的实例的引用,从而可以独立地检查这些中的每一个。
由于定时视听媒体的性质,在成功初始化AVAsset
时,其密钥的一些或所有值可能不会立即可用。任何键的值都可以随时请求,并且AVAsset
将始终同步返回其值,尽管它可能必须阻塞调用线程才能这样做。
为了避免阻塞,客户可以注册他们对特定密钥,并在其值可用时收到通知。有关更多详细信息,请参见AVAsynchronousKeyValueLoading.h
。
在iOS
上,避免阻止尤为重要。为了保持响应性,阻塞太长时间的同步请求(例如,对慢速HTTP
服务器上的asset
的属性请求)可能导致重置媒体服务。
要播放AVAsset
的实例,使用它初始化AVPlayerItem
的实例,使用AVPlayerItem
设置其呈现状态(例如是否应该播放asset
的有限timeRange
等),并将AVPlayerItem
提供给AVPlayer
根据项目是单独播放还是与其他项目集合一起播放。 AVPlayerItem.h
和AVPlayer.h
中提供的完整详细信息。
AVAssets
也可以插入到AVMutableCompositions
中,以便从一个或多个源资源中组合视听结构。
AVAsset数据结构
AVAsset
数据结构图如下:
AVAsset属性和方法
+ (instancetype)assetWithURL:(NSURL *)URL;
返回使用指定的URL
初始化的AVAsset
子类的新的初始化实例。
@property (nonatomic, readonly) CMTime duration;
表示asset
的持续时间。如果@“providePreciseDurationAndTiming”
为NO
,则返回最佳可用的持续时间估计值。对于与URL
初始化的asset
,可以在初始化时设置与时序相关的属性首选的精度。请参阅下面的AVURLAsset
的AVURLAssetPreferPreciseDurationAndTimingKey
。
@property (nonatomic, readonly) float preferredRate;
表示asset
的natural rate
;经常但不总是1.0
。
@property (nonatomic, readonly) float preferredVolume;
表示要播放asset
的可听媒体的首选音量;经常但不总是1.0
。
@property (nonatomic, readonly) CGAffineTransform preferredTransform;
表示要应用于asset
的可视内容以进行呈现或处理的首选变换;值通常但不总是identity
变换
@property (nonatomic, readonly) CGSize naturalSize NS_DEPRECATED(10_7, 10_8, 4_0, 5_0);
不推荐使用以下属性。相反,请根据需要使用接收器视频轨道的naturalSize
和preferredTransform
。请参阅下面的-tracksWithMediaType:
。
@property (nonatomic, readonly) AVDisplayCriteria *preferredDisplayCriteria API_AVAILABLE(tvos(11.2)) API_UNAVAILABLE(ios) API_UNAVAILABLE(macos, watchos);
指导显示模式,最适合播放此特定的asset
。
AVAssetAsynchronousLoading
@property (nonatomic, readonly) BOOL providesPreciseDurationAndTiming;
表示asset
提供精确的时间。请参阅上面的@
duration
和下面的AVURLAssetPreferPreciseDurationAndTimingKey
。
- (void)cancelLoading;
如果任何加载请求仍未完成,则取消分配或完成AVAsset
实例将隐式取消加载。
AVAssetReferenceRestrictions
可以将这些常量传递给AVURLAssetReferenceRestrictionsKey
,以控制对外部媒体数据的引用的解析。
typedef NS_OPTIONS(NSUInteger, AVAssetReferenceRestrictions) {
AVAssetReferenceRestrictionForbidNone = 0UL,
AVAssetReferenceRestrictionForbidRemoteReferenceToLocal = (1UL << 0),
AVAssetReferenceRestrictionForbidLocalReferenceToRemote = (1UL << 1),
AVAssetReferenceRestrictionForbidCrossSiteReference = (1UL << 2),
AVAssetReferenceRestrictionForbidLocalReferenceToLocal = (1UL << 3),
AVAssetReferenceRestrictionForbidAll = 0xFFFFUL,
};
其中各个选项的含义如下:
-
AVAssetReferenceRestrictionForbidNone
: 表示应遵循所有类型的引用。 -
AVAssetReferenceRestrictionForbidRemoteReferenceToLocal
: 指示不应遵循从远程asset
(例如,通过http
URL
引用)到本地媒体数据(例如,存储在本地文件中)的引用。 -
AVAssetReferenceRestrictionForbidLocalReferenceToRemote
: 表示不应遵循从本地asset
到远程媒体数据的引用。 -
AVAssetReferenceRestrictionForbidCrossSiteReference
: 表示不应遵循从远程asset
到存储在其他站点的远程媒体数据的引用。 -
AVAssetReferenceRestrictionForbidLocalReferenceToLocal
: 表示不应遵循从本地asset
到存储在asset
容器文件外部的本地媒体数据的引用。 -
AVAssetReferenceRestrictionForbidAll
: 表示应仅允许对存储在asset
容器文件中的媒体数据的引用。@property (nonatomic, readonly) AVAssetReferenceRestrictions referenceRestrictions NS_AVAILABLE(10_7, 5_0);
表示接收器使用的参考限制。
对于AVURLAsset
,此属性反映了AVURLAssetReferenceRestrictionsKey
传入的值(如果有)。有关参考限制的完整讨论,请参阅下面的AVURLAssetReferenceRestrictionsKey
。此属性的默认值为AVAssetReferenceRestrictionForbidNone
。
AVAssetTrackInspection
@property (nonatomic, readonly) NSArray<AVAssetTrack *> *tracks;
提供asset
包含的AVAssetTracks
数组
- (nullable AVAssetTrack *)trackWithTrackID:(CMPersistentTrackID)trackID;
函数名 | trackWithTrackID: |
---|---|
函数解释 | 提供表示指定trackID 轨道的AVAssetTrack 实例。 |
参数 |
trackID :请求的AVAssetTrack的trackID 。 |
返回值 |
AVAssetTrack 的一个实例;如果没有指定trackID 的跟踪可用,则可以为nil 。 |
备注 | 当加载了key @“tracks” 时,变为可调用而不会阻塞状态 |
- (NSArray<AVAssetTrack *> *)tracksWithMediaType:(AVMediaType)mediaType;
函数名 | tracksWithMediaType: |
---|---|
函数解释 | 提供asset 的AVAssetTracks 数组,用于显示指定媒体类型的媒体。 |
参数 |
mediaType :AVAsset 过滤其AVAssetTracks 的媒体类型。 (媒体类型在AVMediaFormat.h 中定义。) |
返回值 |
AVAsetTracks 的NSArray ;如果没有指定媒体类型的曲目可用,则可能为空。 |
备注 | 当加载了key @“tracks” 时,变为可调用而不会阻塞状态 |
- (NSArray<AVAssetTrack *> *)tracksWithMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic;
函数名 | tracksWithMediaCharacteristic: |
---|---|
函数解释 | 提供asset 的AVAssetTracks 数组,以呈现具有指定特征的媒体。 |
参数 |
mediaCharacteristic :根据 AVAsset 过滤其AVAssetTracks 的媒体特性。 (媒体特征在AVMediaFormat.h 中定义。) |
返回值 |
AVAsetTracks的NSArray; 如果没有具有指定特征的tracks 可用,则可能为空。 |
备注 | 当加载了key @“tracks” 时,变为可调用而不会阻塞状态 |
@property (nonatomic, readonly) NSArray<AVAssetTrackGroup *> *trackGroups NS_AVAILABLE(10_9, 7_0);
函数名 | trackGroups |
---|---|
函数解释 | 接收器中的所有track 组。 |
备注 | 此属性的值是AVAssetTrackGroups 的NSArray ,每个NSArray 表示接收器中不同的track 分组。 |
AVAssetMetadataReading
@property (nonatomic, readonly, nullable) AVMetadataItem *creationDate NS_AVAILABLE(10_8, 5_0);
表示asset
的创建日期为AVMetadataItem
。可能是nil
。如果asset
以可转换为NSDate
的形式存储创建日期,则AVMetadataItem
的dateValue
属性将提供NSDate
的实例。否则,创建日期仅作为字符串值,通过 - [AVMetadataItem stringValue]
。
@property (nonatomic, readonly, nullable) NSString *lyrics;
提供对适合当前区域设置的asset
的lyrics
的访问。
@property (nonatomic, readonly) NSArray<AVMetadataItem *> *commonMetadata;
为每个可用值的公共元数据键提供对AVMetadataItems
数组的访问;可以通过+ [AVMetadataItem metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:]
并根据标识符+ [AVMetadataItem metadataItemsFromArray:filteredByIdentifier:]
根据语言过滤项目。
@property (nonatomic, readonly) NSArray<AVMetadataItem *> *metadata NS_AVAILABLE(10_10, 8_0);
为所有可用值的元数据标识符提供对AVMetadataItems
数组的访问;可以通过+ [AVMetadataItem metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:]
并根据标识符+ [AVMetadataItem metadataItemsFromArray:filteredByIdentifier:]
根据语言过滤项目。
@property (nonatomic, readonly) NSArray<AVMetadataFormat> *availableMetadataFormats;
提供NSStrings
的NSArray
,每个NSAtrray
表示asset
可用的Metadata
格式(例如ID3
,iTunes
元数据
等)。metadata
格式在AVMetadataFormat.h
中定义。
- (NSArray<AVMetadataItem *> *)metadataForFormat:(AVMetadataFormat)format;
函数名 | metadataForFormat: |
---|---|
函数解释 | 提供AVMetadataItems 的NSArray ,一个用于指定格式的容器中的每个元数据项;随后可以根据语言通过+ [AVMetadataItem metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:] ,根据语言环境+ [AVMetadataItem metadataItemsFromArray:withLocale:] ,或根据键+ [AVMetadataItem metadataItemsFromArray:withKey:keySpace:] 进行过滤。 |
参数 |
format 请求项目的 metadata 格式。 |
返回值 | 包含AVMetadataItems 的NSArray; 如果没有指定格式的metadata ,则可能为空。 |
备注 | 加载key @“availableMetadataFormats” 后,变为可调用而不会阻塞状态 |
AVAssetChapterInspection
@property (readonly) NSArray<NSLocale *> *availableChapterLocales NS_AVAILABLE(10_7, 4_3);
NSLocale
数组。
- (NSArray<AVTimedMetadataGroup *> *)chapterMetadataGroupsWithTitleLocale:(NSLocale *)locale containingItemsWithCommonKeys:(nullable NSArray<AVMetadataKey> *)commonKeys NS_AVAILABLE(10_7, 4_3);
函数名 | chapterMetadataGroupsWithTitleLocale:containingMetadataItemsWithCommonKeys: |
---|---|
函数解释 | 提供一个chapter 数组。 |
参数 |
locale :携带要返回的 chapter``title 的metadata items 的区域设置(支持IETF BCP 47 规范)。commonKeys :要包含的 AVMetadataItem 的公共key 的数组;可以是nil 。AVMetadataCommonKeyArtwork 是目前唯一受支持的key 。 |
返回值 | 返回AVTimedMetadataGroup 的数组。 |
备注 | 此方法返回AVTimedMetadataGroup 对象的数组。数组中的每个对象始终包含一个表示章节标题的AVMetadataItem; AVTimedMetadataGroup 对象的timeRange 属性等于chapter title item 的时间范围。如果 metadata item 和metadata group 的时间范围(时间戳和持续时间)重叠,则具有指定公共key 的AVMetadataItem 将添加到现有AVTimedMetadataGroup 对象。不带chapter titles 的item 的区域设置不需要与指定的区域设置参数匹配。可以使用 + [AVMetadataItem metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:] 来完成根据语言对AVTimedMetadataGroups 中的metadata items 的进一步过滤;可以使用+ [AVMetadataItem metadataItemsFromArray:withLocale:] 来完成根据区域设置过滤metadata items 。 |
AVAssetMediaSelection
@property (nonatomic, readonly) NSArray<AVMediaCharacteristic> *availableMediaCharacteristicsWithMediaSelectionOptions NS_AVAILABLE(10_8, 5_0);
提供NSStrings
的NSArray
,每个NSString
指示媒体选择选项可用的媒体特征。
- (nullable AVMediaSelectionGroup *)mediaSelectionGroupForMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic NS_AVAILABLE(10_8, 5_0);
函数名 | mediaSelectionGroupForMediaCharacteristic: |
---|---|
函数解释 | 提供AVMediaSelectionGroup 的实例,其中包含具有指定媒体特征的一个或多个选项。 |
参数 |
mediaCharacteristic :你希望获得可用媒体选择选项的媒体特性。目前支持 AVMediaCharacteristicAudible,AVMediaCharacteristicLegible 和AVMediaCharacteristicVisual 。通过 AVMediaCharacteristicAudible 获取各种语言和各种用途的音频媒体的可用选项组,例如描述性音频。传递 AVMediaCharacteristicLegible 以获取各种语言和各种用途的字幕的可用选项组。传递 AVMediaCharacteristicVisual 以获取视频媒体的可用选项组。 |
返回值 |
AVMediaSelectionGroup 的一个实例。可能是nil 。 |
备注 | 加载key @“availableMediaCharacteristicsWithMediaSelectionOptions” 后,变为可调用而不会阻塞状态。如果 asset 没有包含具有指定媒体特征的选项的AVMediaSelectionGroup ,则返回值将为nil 。可以使用 AVMediaSelectionGroup 上定义的AVMediaSelectionOptionFiltering 类别来完成根据可播放性,区域设置和其他媒体特征过滤返回的AVMediaSelectionGroup 中的选项。 |
@property (nonatomic, readonly) AVMediaSelection *preferredMediaSelection NS_AVAILABLE(10_11, 9_0);
函数名 | preferredMediaSelection |
---|---|
函数解释 | 提供AVMediaSelection 的实例,为每个接收者的媒体选择组提供默认选择。 |
@property (nonatomic, readonly) NSArray <AVMediaSelection *> *allMediaSelections NS_AVAILABLE(10_13, 11_0);
函数名 | allMediaSelections |
---|---|
函数解释 | 提供此asset 的AVMediaSelection 的所有排列的数组。 |
备注 | 加载key @ “availableMediaCharacteristicsWithMediaSelectionOptions” 后,变为可调用而不会阻塞状态。 |
AVAssetProtectedContent
@property (nonatomic, readonly) BOOL hasProtectedContent NS_AVAILABLE(10_7, 4_2);
函数名 | hasProtectedContent |
---|---|
函数介绍 | 指示asset 是否具有受保护的内容。 |
备注 | 未经成功授权,包含受保护内容的asset 可能无法播放,即使"playable" 属性的值为YES 。有关如何使用此类asset 的详细信息,请参阅AVAssetUsability 类别中的属性。在OS X 上,客户端可以使用AVPlayerItemProtectedContentAdditions.h 中的接口来请求授权来播放asset 。 |
AVAssetFragments
@property (nonatomic, readonly) BOOL canContainFragments NS_AVAILABLE(10_11, 9_0);
函数名 | canContainFragments |
---|---|
函数解释 | 指示asset 是否能够通过片段进行扩展。 |
备注 | 对于QuickTime 电影文件和MPEG-4 文件,如果'moov' 框中存在'mvex' 框,则canContainFragments 的值为YES 。对于那些类型,'mvex' 框表示可能存在后来的'moof' 框。 |
@property (nonatomic, readonly) BOOL containsFragments NS_AVAILABLE(10_11, 9_0);
函数名 | containsFragments |
---|---|
函数解释 | 指示asset 是否至少由一个片段扩展。 |
备注 | 对于QuickTime 影片文件和MPEG-4 文件,如果canContainFragments 为YES 且“moov” 框后面至少有一个“moof” 框,则此属性的值为YES 。 |
@property (nonatomic, readonly) CMTime overallDurationHint NS_AVAILABLE(10_12_2, 10_2);
函数名 | overallDurationHint |
---|---|
函数解释 | 指示现在存在或可能在将来附加的片段的总持续时间,以便延长asset 的持续时间。 |
备注 | 对于QuickTime 影片文件和MPEG-4 文件,此属性的值是从“mvex” 框的“mehd” 框中获取的(如果存在)。如果没有可用的总片段持续时间提示,则此属性的值为kCMTimeInvalid 。 |
AVAssetUsability
@property (nonatomic, readonly, getter=isPlayable) BOOL playable NS_AVAILABLE(10_7, 4_3);
属性名 | playable |
---|---|
函数解释 | 指示AVPlayer 是否可以满足用户期望的方式播放asset 的内容。 |
备注 | 当playable 为No 时,客户端可以尝试播放,但是这可能导致不合标准的播放体验。 |
@property (nonatomic, readonly, getter=isExportable) BOOL exportable NS_AVAILABLE(10_7, 4_3);
指示AVAssetExportSession
是否可以与receiver
一起用于export
@property (nonatomic, readonly, getter=isReadable) BOOL readable NS_AVAILABLE(10_7, 4_3);
指示AVAssetReader
是否可以与receiver
一起使用以提取媒体数据
@property (nonatomic, readonly, getter=isComposable) BOOL composable NS_AVAILABLE(10_7, 4_3);
指示receiver
是否可用于构建AVMutableComposition
@property (nonatomic, readonly, getter=isCompatibleWithSavedPhotosAlbum) BOOL compatibleWithSavedPhotosAlbum NS_AVAILABLE_IOS(5_0);
-
TARGET_OS_IPHONE
环境下才适用
表示receiver
是否可以写入保存的相册
@property (nonatomic, readonly, getter=isCompatibleWithAirPlayVideo) BOOL compatibleWithAirPlayVideo NS_AVAILABLE(10_11, 9_0);
函数名 | compatibleWithAirPlayVideo |
---|---|
解释 | 指示asset 是否与AirPlay Video 兼容。 |
备注 | 如果使用receiver 初始化的AVPlayerItem 可以由外部设备通过AirPlay Video 播放,则为YES 。 |
上一章 | 目录 | 下一章 |
---|