AVPlayer视频播放之 - AVAsset

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


自定义播放媒体所需的对象,如果仅实现单纯的播放功能,那么可以跳过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<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的相关属性和方法。


AVURLAssetAVAsset用来从本地或远程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)。目前已被注册的类型名有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;的补充;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容