AVPlayer视频播放之 - AVAsset

 视频播放作为现在app端不可少的一部分,系统提供框架AVKit有时不能满足我们的需求和审美,所以大多数情况下我们会采用自定义AVPlayer的方式来实现视频播放功能。


AVPlayer视频播放之 - AVAsset_第1张图片
自定义播放媒体所需的对象,如果仅实现单纯的播放功能,那么可以跳过AVAsset相关内容

 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 *tracks;asset包含的所有轨道(AVAssetTrack的实例)的集合;

  • - (nullable AVAssetTrack *)trackWithTrackID:(CMPersistentTrackID)trackID;返回具有指定轨道ID的轨道,如果指定trackID的轨道不不存在,则返回nil;

  • - (NSArray *)tracksWithMediaType:(AVMediaType)mediaType;返回呈现指定类型媒体的资产的资产轨道数组;

  • - (NSArray *)tracksWithMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic;返回呈现具有指定特征的媒体的AVAssetTrack对象的数组;

  • @property (nonatomic, readonly) NSArray *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 *commonMetadata; 属性中包含着当前视频公共密钥空间中常见格式类型的元数据;

  • @property (nonatomic, readonly) NSArray *metadata属性中包含当前视频所有格式类型的元数据;

  • @property (nonatomic, readonly) NSArray *availableMetadataFormats;一组字符串,每个字符串都代表资产可用的元数据格式;

  • - (NSArray *)metadataForFormat:(AVMetadataFormat)format;根据元数据格式返回AVMetadataItem对象数组。

以上是常用的AVAsset属性和方法,下面就介绍其常用子类AVURLAsset的相关属性和方法。


AVURLAssetAVAsset用来从本地或远程URL初始化资产的具体子类。

  • - (instancetype)initWithURL:(NSURL *)URL options:(nullable NSDictionary *)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 *)options;类方法,返回AVURLAsset的实例;

  • @property (nonatomic, readonly, copy) NSURL *URL;获取asset初始化的URL;

  • + (NSArray *)audiovisualTypes返回AVURLAsset类支持的文件类型的数组;

  • + (NSArray *)audiovisualMIMETypes返回AVURLAsset类支持的MIME类型的数组;

  • + (BOOL)isPlayableExtendedMIMEType: (NSString *)extendedMIMEType判断该asset是否可以使用给定的编解码器和容器类型播放;

1、MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
2、一个MIME类型包括一个类型(type),一个子类型(subtype)。此外可以加上一个或多个可选参数(optional parameter)。目前已被注册的类型名有applicationaudioexampleimagemessagemodelmultiparttextvideo。具体请参考

  • @property (nonatomic, readonly) AVAssetResourceLoader *resourceLoader;获取资产相关联的资源加载器。

  • @property (nonatomic, readonly, nullable) AVAssetCache *assetCacheiOS 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;的补充;

你可能感兴趣的:(AVPlayer视频播放之 - AVAsset)