视频播放作为现在app端不可少的一部分,系统提供框架AVKit有时不能满足我们的需求和审美,所以大多数情况下我们会采用自定义AVPlayer的方式来实现视频播放功能。
AVAsset:为定时视听媒体定义AVFoundation模型的抽象的、不可变的类。
每个asset包含想要一起呈现或处理的统一的媒体类型轨道的集合。asset中的每个媒体数据片段都是统一的类型,称为轨道(track)。AVAsset
是一个容器对象,由一个或多个AVAssetTrack
实例组成,最常用的track类型是音频和视频track,AVAssetTrack还可以模拟其他辅助轨道,如隐藏式字幕,字幕和定时元数据。AVAsset通常通过具体的子类AVURLAsset通过NSURL实例化,该NSURL引用视听媒体资源,如流(包括HTTP实时流),QuickTime电影文件,MP3文件和其他类型的文件。
+ (instancetype)assetWithURL:(NSURL *)URL;
;根据url创建实例,实际上是创建了它子类AVUrlAsset的一个实例,而AVAsset是一个抽象类,不能直接被实例化。@property (nonatomic, readonly) CMTime duration;
asset持续时间,CMTime是个结构体; 如果属性providedPreciseDurationAndTiming
为NO,则返回持续时间的最佳可用估计值。 与时间相关的属性首选的精确度可以在AVURLAsset初始化时为URL初始化的资源设置 --- 创建AVURLAsset时传入的AVURLAssetPreferPreciseDurationAndTimingKey
值为NO(不传默认为NO),duration会取一个估计值,计算量比较小。反之如果为YES,duration需要返回一个精确值,计算量会比较大,耗时比较长
typedef struct
{
CMTimeValue value; // long long(int64_t)类型, CMTime的值, value/timescale = seconds(秒)
CMTimeScale timescale; // 循环次数
CMTimeFlags flags; // CMTime标志位,也是结构体。
CMTimeEpoch epoch; //
} CMTime;
typedef CF_OPTIONS( uint32_t, CMTimeFlags ) {
kCMTimeFlags_Valid = 1UL<<0, // 必须设置,否则CMTime被认为是无效的,必须设置,否则CMTime被认为是无效的。
kCMTimeFlags_HasBeenRounded = 1UL<<1, //在CMTime值xuya四舍五入或者从另一个四舍五入CMTime派生时设置。
kCMTimeFlags_PositiveInfinity = 1UL<<2, // 如果CMTime是+ inf(正无穷),则设置
kCMTimeFlags_NegativeInfinity = 1UL<<3, // 如果CMTime是- inf(负无穷),则设置
kCMTimeFlags_Indefinite = 1UL<<4, // 如果CMTime不确定/未知,则设置。如直播的持续时间。
kCMTimeFlags_ImpliedValueFlagsMask = kCMTimeFlags_PositiveInfinity | kCMTimeFlags_NegativeInfinity | kCMTimeFlags_Indefinite
};
@property (nonatomic, readonly) float preferredRate;
播放速率,一般为1;@property (nonatomic, readonly) float preferredVolume;
播放的优选音量,一般为1;@property (nonatomic, readonly) CGAffineTransform preferredTransform;
用于呈现或处理asset可视内容的首选转换,一般为单位变换;@property (nonatomic, readonly) BOOL providesPreciseDurationAndTiming;
一个布尔值,指示资产是否提供精确的时间,NO为不提供,YSE提供。可以在使用URL初始化资产时,设置与时间相关的属性所需的精确度;- (void)cancelLoading;
对所有观察者取消所有正在加载中的值;@property (nonatomic, readonly) AVAssetReferenceRestrictions referenceRestrictions;
获取接受者使用的控制对外部媒体数据引用的限制;对于AVURLAsset来说,该属性表示AVURLAssetReferenceRestrictionsKey
键(如果存在)对应的值。
typedef NS_OPTIONS(NSUInteger, AVAssetReferenceRestrictions) {
AVAssetReferenceRestrictionForbidNone = 0UL, // 没有引用限制,应遵循所有类型的引用。
AVAssetReferenceRestrictionForbidRemoteReferenceToLocal = (1UL << 0), // 禁止从远程引用到本地(下载)
AVAssetReferenceRestrictionForbidLocalReferenceToRemote = (1UL << 1), // 禁止本地引用到远程 (上传)
AVAssetReferenceRestrictionForbidCrossSiteReference = (1UL << 2), // 禁止远程跨站点引用
AVAssetReferenceRestrictionForbidLocalReferenceToLocal = (1UL << 3), // 禁止除了存储在asset容器文件之外的本地引用本地
AVAssetReferenceRestrictionForbidAll = 0xFFFFUL, // 禁止全部,只允许引用存储在asset容器文件中的媒体数据。
};
确定asset某些功能的可用性 ⤵️
@property (nonatomic, readonly, getter=isPlayable) BOOL playable
;指示AVPlayer是否可以以满足用户期望的方式播放资产的内容(指这一asset或者它的URL是否能用来初始化一个AVPlayerItem的实例);@property (nonatomic, readonly) BOOL hasProtectedContent
;指示asset是否具有受保护的内容。即使媒体资源的playable
属性值为YES。包含受保护内容的资产可能无法在未经授权的情况下播放。@property (nonatomic, readonly, getter=isExportable) BOOL exportable
;指示asset是否可以使用AVAssetExportSession
导出。@property (nonatomic, readonly, getter=isReadable) BOOL readable
;指示是否可以使用AVAssetReader提取asset的媒体数据。@property (nonatomic, readonly, getter=isComposable) BOOL composable
; 指示是否该asset可以在AVCompositionTrack对象的区段内使用,被用来创建一个AVMutableComposition对象。@property (nonatomic, readonly, getter=isCompatibleWithSavedPhotosAlbum) BOOL compatibleWithSavedPhotosAlbum
;指示是否可以将资源写入“已保存的照片”相册@property (nonatomic, readonly, getter=isCompatibleWithAirPlayVideo) BOOL compatibleWithAirPlayVideo
;指示资产是否与AirPlay Video兼容。如果用asset初始化的AVPlayerItem可以通过AirPlay Video由外部设备播放则为YES,反之为NO。
访问轨道(tracks)相关 ⤵️
@property (nonatomic, readonly) NSArray<AVAssetTrack *> *tracks;
asset包含的所有轨道(AVAssetTrack的实例)的集合;- (nullable AVAssetTrack *)trackWithTrackID:(CMPersistentTrackID)trackID;
返回具有指定轨道ID的轨道,如果指定trackID的轨道不不存在,则返回nil;- (NSArray<AVAssetTrack *> *)tracksWithMediaType:(AVMediaType)mediaType;
返回呈现指定类型媒体的资产的资产轨道数组;- (NSArray<AVAssetTrack *> *)tracksWithMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic;
返回呈现具有指定特征的媒体的AVAssetTrack对象的数组;@property (nonatomic, readonly) NSArray<AVAssetTrackGroup *> *trackGroups
返回asset中所有轨道组(不同的轨道分组)的数组;
访问元数据相关 ⤵️
@property (nonatomic, readonly, nullable) AVMetadataItem *creationDate;
;获取asset的创建日期,该属性可能为nil,如果创建日期已被asset以可转换为NSDate对象的形式存储,则AVMetadataItem的dateValue属性将提供一个NSDate的实例。否则创建日期只能使用其stringValue值作为字符串值。@property (nonatomic, readonly, nullable) NSString *lyrics;
提供对适合当前语言环境的asset的文字歌词的访问;@property (nonatomic, readonly) NSArray<AVMetadataItem *> *commonMetadata;
属性中包含着当前视频公共密钥空间中常见格式类型的元数据;@property (nonatomic, readonly) NSArray<AVMetadataItem *> *metadata
属性中包含当前视频所有格式类型的元数据;@property (nonatomic, readonly) NSArray<AVMetadataFormat> *availableMetadataFormats;
一组字符串,每个字符串都代表资产可用的元数据格式;- (NSArray<AVMetadataItem *> *)metadataForFormat:(AVMetadataFormat)format;
根据元数据格式返回AVMetadataItem对象数组。
以上是常用的AVAsset属性和方法,下面就介绍其常用子类AVURLAsset的相关属性和方法。
AVURLAsset
是AVAsset
用来从本地或远程URL初始化资产的具体子类。
-
- (instancetype)initWithURL:(NSURL *)URL options:(nullable NSDictionary<NSString *, id> *)options;
指定的初始化方法;其中,options是包含用于自定义资产初始化选项的字典。有关键如下:AVF_EXPORT NSString *const AVURLAssetPreferPreciseDurationAndTimingKey
: 对应的值是一个包含在NSNumber对象中的BOOL值,表示资产是否应该准备好指示一个精确的持续时间,并提供准确的随机访问。YES,提供,NO不提供。 如果将nil
作为options参数的值传递或者如果传递的值不是AVURLAssetPreferPreciseDurationAndTimingKey
对应的@0
或者@1
的时,则默认值为NO。如果该资产(asset)仅用于播放,由于AVPlayer在全部精度不可用时将支持按时间进行近似随机访问,因此缺省值为NO即可。 如果要将资产插入到AVMutableComposition中,则通常需要精确的随机访问,建议使用YES值。QuickTime电影文件和MPEG-4文件为精确计时提供了足够的摘要信息,并且不需要额外的解析来准备,一般使用NO即可,其他格式不能提供足够的摘要信息,只有在对文件内容进行初步检查之后,才能对其进行准确的随机访问。如果资产的URL所引用的定时媒体资源不能实现精确的持续时间和定时,则即使通过使用此密钥请求精确的定时,AVAsset.providesPreciseDurationAndTiming
也将为NO。AVF_EXPORT NSString *const AVURLAssetReferenceRestrictionsKey
:设置在解析对外部媒体数据的引用时资源使用的限制。 这个键的值是一个或多个包含AVAssetReferenceRestrictions
枚举值。AVF_EXPORT NSString *const AVURLAssetHTTPCookiesKey
:默认情况下,AVURLAsset只能访问适用于AVURLAsset的URL的客户端默认cookie存储中的cookie。 可以使用此初始化选项来补充可用于资产的Cookie。(1、)HTTP cookie不适用于非HTTP(S)URLS。(2、)在HLS --- 流媒体中,许多HTTP请求(例如,媒体,密钥,变体索引)可能被发布到不同的路径或主机。在这两种情况下,HTTP请求中任何不适用于AVURLAsset的URL的Cookie都会丢失,这个init选项允许AVURLAsset为这些HTTP(S)请求使用额外的HTTP cookie。AVF_EXPORT NSString *const AVURLAssetAllowsCellularAccessKey
:指示是否允许代表此资产的网络请求使用蜂窝接口。默认YES。
+ (instancetype)URLAssetWithURL:(NSURL *)URL options:(nullable NSDictionary<NSString *, id> *)options;
类方法,返回AVURLAsset的实例;@property (nonatomic, readonly, copy) NSURL *URL;
获取asset初始化的URL;+ (NSArray<AVFileType> *)audiovisualTypes
返回AVURLAsset类支持的文件类型的数组;+ (NSArray<NSString *> *)audiovisualMIMETypes
返回AVURLAsset类支持的MIME类型的数组;+ (BOOL)isPlayableExtendedMIMEType: (NSString *)extendedMIMEType
判断该asset是否可以使用给定的编解码器和容器类型播放;
1、MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
2、一个MIME类型包括一个类型(type),一个子类型(subtype)。此外可以加上一个或多个可选参数(optional parameter)。目前已被注册的类型名有application
、audio
、example
、image
、message
、model
、multipart
、text
、video
。具体请参考
@property (nonatomic, readonly) AVAssetResourceLoader *resourceLoader
;获取资产相关联的资源加载器。@property (nonatomic, readonly, nullable) AVAssetCache *assetCache
iOS 10之后可用,获取与资产的关联资产缓存(如果存在);- (nullable AVAssetTrack *)compatibleTrackForCompositionTrack:(AVCompositionTrack *)compositionTrack;
返回可以将任何时间范围插入到给定compositionTrack
的资产轨迹。使用AVMutableCompositionTrack的- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError * _Nullable * _Nullable)outError
方法将轨道插入。该方法是AVMutableComposition的方法 ---- (nullable AVMutableCompositionTrack *)mutableTrackCompatibleWithTrack:(AVAssetTrack *)track;
的补充;