《AVFoundation》专辑视频播放器和音视频基础知识

AVFoundation编程指南09-AVAsset解读(上)

2019-05-17  本文已影响9人  张芳涛

写在前面

喜欢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.hAVPlayer.h中提供的完整详细信息。

AVAssets也可以插入到AVMutableCompositions中,以便从一个或多个源资源中组合视听结构。

AVAsset数据结构

AVAsset数据结构图如下:

AVAsset数据结构

AVAsset属性和方法

+ (instancetype)assetWithURL:(NSURL *)URL;

返回使用指定的URL初始化的AVAsset子类的新的初始化实例。

@property (nonatomic, readonly) CMTime duration;

表示asset的持续时间。如果@“providePreciseDurationAndTiming”NO,则返回最佳可用的持续时间估计值。对于与URL初始化的asset,可以在初始化时设置与时序相关的属性首选的精度。请参阅下面的AVURLAssetAVURLAssetPreferPreciseDurationAndTimingKey

@property (nonatomic, readonly) float preferredRate;

表示assetnatural 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);

不推荐使用以下属性。相反,请根据需要使用接收器视频轨道的naturalSizepreferredTransform。请参阅下面的-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,
};

其中各个选项的含义如下:

表示接收器使用的参考限制。

对于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:
函数解释 提供assetAVAssetTracks数组,用于显示指定媒体类型的媒体。
参数 mediaType:
AVAsset过滤其AVAssetTracks的媒体类型。 (媒体类型在AVMediaFormat.h中定义。)
返回值 AVAsetTracksNSArray;如果没有指定媒体类型的曲目可用,则可能为空。
备注 当加载了key @“tracks”时,变为可调用而不会阻塞状态
- (NSArray<AVAssetTrack *> *)tracksWithMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic;
函数名 tracksWithMediaCharacteristic:
函数解释 提供assetAVAssetTracks数组,以呈现具有指定特征的媒体。
参数 mediaCharacteristic:
根据AVAsset过滤其AVAssetTracks的媒体特性。 (媒体特征在AVMediaFormat.h中定义。)
返回值 AVAsetTracks的NSArray;如果没有具有指定特征的tracks可用,则可能为空。
备注 当加载了key @“tracks”时,变为可调用而不会阻塞状态
@property (nonatomic, readonly) NSArray<AVAssetTrackGroup *> *trackGroups NS_AVAILABLE(10_9, 7_0);
函数名 trackGroups
函数解释 接收器中的所有track组。
备注 此属性的值是AVAssetTrackGroupsNSArray,每个NSArray表示接收器中不同的track分组。

AVAssetMetadataReading

@property (nonatomic, readonly, nullable) AVMetadataItem *creationDate NS_AVAILABLE(10_8, 5_0);

表示asset的创建日期为AVMetadataItem。可能是nil。如果asset以可转换为NSDate的形式存储创建日期,则AVMetadataItemdateValue属性将提供NSDate的实例。否则,创建日期仅作为字符串值,通过 - [AVMetadataItem stringValue]

@property (nonatomic, readonly, nullable) NSString *lyrics;

提供对适合当前区域设置的assetlyrics的访问。

@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;

提供NSStringsNSArray,每个NSAtrray表示asset可用的Metadata格式(例如ID3iTunes 元数据等)。metadata格式在AVMetadataFormat.h中定义。

- (NSArray<AVMetadataItem *> *)metadataForFormat:(AVMetadataFormat)format;
函数名 metadataForFormat:
函数解释 提供AVMetadataItemsNSArray,一个用于指定格式的容器中的每个元数据项;随后可以根据语言通过+ [AVMetadataItem metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:],根据语言环境+ [AVMetadataItem metadataItemsFromArray:withLocale:],或根据键+ [AVMetadataItem metadataItemsFromArray:withKey:keySpace:]进行过滤。
参数 format
请求项目的metadata格式。
返回值 包含AVMetadataItemsNSArray;如果没有指定格式的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``titlemetadata items的区域设置(支持IETF BCP 47规范)。
commonKeys:
要包含的AVMetadataItem的公共key的数组;可以是nil
AVMetadataCommonKeyArtwork是目前唯一受支持的key
返回值 返回AVTimedMetadataGroup的数组。
备注 此方法返回AVTimedMetadataGroup对象的数组。数组中的每个对象始终包含一个表示章节标题的AVMetadataItem; AVTimedMetadataGroup对象的timeRange属性等于chapter title item的时间范围。

如果metadata itemmetadata group的时间范围(时间戳和持续时间)重叠,则具有指定公共keyAVMetadataItem将添加到现有AVTimedMetadataGroup对象。不带chapter titlesitem的区域设置不需要与指定的区域设置参数匹配。

可以使用+ [AVMetadataItem metadataItemsFromArray:filteredAndSortedAccordingToPreferredLanguages:]来完成根据语言对AVTimedMetadataGroups中的metadata items的进一步过滤;可以使用+ [AVMetadataItem metadataItemsFromArray:withLocale:]来完成根据区域设置过滤metadata items

AVAssetMediaSelection

@property (nonatomic, readonly) NSArray<AVMediaCharacteristic> *availableMediaCharacteristicsWithMediaSelectionOptions NS_AVAILABLE(10_8, 5_0);

提供NSStringsNSArray,每个NSString指示媒体选择选项可用的媒体特征。

- (nullable AVMediaSelectionGroup *)mediaSelectionGroupForMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic NS_AVAILABLE(10_8, 5_0);
函数名 mediaSelectionGroupForMediaCharacteristic:
函数解释 提供AVMediaSelectionGroup的实例,其中包含具有指定媒体特征的一个或多个选项。
参数 mediaCharacteristic:

你希望获得可用媒体选择选项的媒体特性。目前支持AVMediaCharacteristicAudible,AVMediaCharacteristicLegibleAVMediaCharacteristicVisual

通过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
函数解释 提供此assetAVMediaSelection的所有排列的数组。
备注 加载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文件,如果canContainFragmentsYES“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的内容。
备注 playableNo时,客户端可以尝试播放,但是这可能导致不合标准的播放体验。
@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);

表示receiver是否可以写入保存的相册

@property (nonatomic, readonly, getter=isCompatibleWithAirPlayVideo) BOOL compatibleWithAirPlayVideo NS_AVAILABLE(10_11, 9_0);
函数名 compatibleWithAirPlayVideo
解释 指示asset是否与AirPlay Video兼容。
备注 如果使用receiver初始化的AVPlayerItem可以由外部设备通过AirPlay Video播放,则为YES
上一章 目录 下一章
上一篇下一篇

猜你喜欢

热点阅读