AVPlayer視頻播放之 - AVAsset

?視頻播放作為現(xiàn)在app端不可少的一部分,系統(tǒng)提供框架AVKit有時不能滿足我們的需求和審美释移,所以大多數(shù)情況下我們會采用自定義AVPlayer的方式來實現(xiàn)視頻播放功能。


自定義播放媒體所需的對象,如果僅實現(xiàn)單純的播放功能,那么可以跳過AVAsset相關(guān)內(nèi)容

?AVAsset:為定時視聽媒體定義AVFoundation模型的抽象的聂喇、不可變的類。
?每個asset包含想要一起呈現(xiàn)或處理的統(tǒng)一的媒體類型軌道的集合蔚携。asset中的每個媒體數(shù)據(jù)片段都是統(tǒng)一的類型希太,稱為軌道(track)。AVAsset是一個容器對象酝蜒,由一個或多個AVAssetTrack實例組成誊辉,最常用的track類型是音頻和視頻track,AVAssetTrack還可以模擬其他輔助軌道亡脑,如隱藏式字幕堕澄,字幕和定時元數(shù)據(jù)邀跃。AVAsset通常通過具體的子類AVURLAsset通過NSURL實例化,該NSURL引用視聽媒體資源蛙紫,如流(包括HTTP實時流)拍屑,QuickTime電影文件,MP3文件和其他類型的文件坑傅。

  • + (instancetype)assetWithURL:(NSURL *)URL;;根據(jù)url創(chuàng)建實例,實際上是創(chuàng)建了它子類AVUrlAsset的一個實例,而AVAsset是一個抽象類,不能直接被實例化丽涩。

  • @property (nonatomic, readonly) CMTime duration;asset持續(xù)時間,CMTime是個結(jié)構(gòu)體; 如果屬性providedPreciseDurationAndTiming為NO裁蚁,則返回持續(xù)時間的最佳可用估計值矢渊。 與時間相關(guān)的屬性首選的精確度可以在AVURLAsset初始化時為URL初始化的資源設(shè)置 --- 創(chuàng)建AVURLAsset時傳入的AVURLAssetPreferPreciseDurationAndTimingKey值為NO(不傳默認為NO),duration會取一個估計值枉证,計算量比較小矮男。反之如果為YES,duration需要返回一個精確值室谚,計算量會比較大毡鉴,耗時比較長

typedef struct
{
    CMTimeValue value;      // long long(int64_t)類型, CMTime的值秒赤, value/timescale = seconds(秒)
    CMTimeScale timescale;  // 循環(huán)次數(shù) 
    CMTimeFlags flags;      // CMTime標志位猪瞬,也是結(jié)構(gòu)體。
    CMTimeEpoch epoch;      //
} CMTime;
typedef CF_OPTIONS( uint32_t, CMTimeFlags ) {
    kCMTimeFlags_Valid = 1UL<<0,  // 必須設(shè)置入篮,否則CMTime被認為是無效的陈瘦,必須設(shè)置,否則CMTime被認為是無效的潮售。
    kCMTimeFlags_HasBeenRounded = 1UL<<1, //在CMTime值xuya四舍五入或者從另一個四舍五入CMTime派生時設(shè)置痊项。
    kCMTimeFlags_PositiveInfinity = 1UL<<2, // 如果CMTime是+ inf(正無窮),則設(shè)置
    kCMTimeFlags_NegativeInfinity = 1UL<<3, // 如果CMTime是- inf(負無窮)酥诽,則設(shè)置
    kCMTimeFlags_Indefinite = 1UL<<4, // 如果CMTime不確定/未知鞍泉,則設(shè)置。如直播的持續(xù)時間肮帐。
    kCMTimeFlags_ImpliedValueFlagsMask = kCMTimeFlags_PositiveInfinity | kCMTimeFlags_NegativeInfinity | kCMTimeFlags_Indefinite
};
  • @property (nonatomic, readonly) float preferredRate;播放速率咖驮,一般為1;

  • @property (nonatomic, readonly) float preferredVolume;播放的優(yōu)選音量训枢,一般為1;

  • @property (nonatomic, readonly) CGAffineTransform preferredTransform;用于呈現(xiàn)或處理asset可視內(nèi)容的首選轉(zhuǎn)換托修,一般為單位變換;

  • @property (nonatomic, readonly) BOOL providesPreciseDurationAndTiming;一個布爾值肮砾,指示資產(chǎn)是否提供精確的時間诀黍,NO為不提供,YSE提供仗处∶泄矗可以在使用URL初始化資產(chǎn)時枣宫,設(shè)置與時間相關(guān)的屬性所需的精確度;

  • - (void)cancelLoading;對所有觀察者取消所有正在加載中的值;

  • @property (nonatomic, readonly) AVAssetReferenceRestrictions referenceRestrictions; 獲取接受者使用的控制對外部媒體數(shù)據(jù)引用的限制;對于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容器文件中的媒體數(shù)據(jù)。
};

確定asset某些功能的可用性 ??
  • @property (nonatomic, readonly, getter=isPlayable) BOOL playable;指示AVPlayer是否可以以滿足用戶期望的方式播放資產(chǎn)的內(nèi)容(指這一asset或者它的URL是否能用來初始化一個AVPlayerItem的實例)好唯;

  • @property (nonatomic, readonly) BOOL hasProtectedContent;指示asset是否具有受保護的內(nèi)容竭沫。即使媒體資源的playable屬性值為YES。包含受保護內(nèi)容的資產(chǎn)可能無法在未經(jīng)授權(quán)的情況下播放骑篙。

  • @property (nonatomic, readonly, getter=isExportable) BOOL exportable;指示asset是否可以使用AVAssetExportSession導出蜕提。

  • @property (nonatomic, readonly, getter=isReadable) BOOL readable;指示是否可以使用AVAssetReader提取asset的媒體數(shù)據(jù)。

  • @property (nonatomic, readonly, getter=isComposable) BOOL composable; 指示是否該asset可以在AVCompositionTrack對象的區(qū)段內(nèi)使用靶端,被用來創(chuàng)建一個AVMutableComposition對象谎势。

  • @property (nonatomic, readonly, getter=isCompatibleWithSavedPhotosAlbum) BOOL compatibleWithSavedPhotosAlbum;指示是否可以將資源寫入“已保存的照片”相冊

  • @property (nonatomic, readonly, getter=isCompatibleWithAirPlayVideo) BOOL compatibleWithAirPlayVideo;指示資產(chǎn)是否與AirPlay Video兼容。如果用asset初始化的AVPlayerItem可以通過AirPlay Video由外部設(shè)備播放則為YES杨名,反之為NO脏榆。


訪問軌道(tracks)相關(guān) ??
  • @property (nonatomic, readonly) NSArray<AVAssetTrack *> *tracks;asset包含的所有軌道(AVAssetTrack的實例)的集合;

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

  • - (NSArray<AVAssetTrack *> *)tracksWithMediaType:(AVMediaType)mediaType;返回呈現(xiàn)指定類型媒體的資產(chǎn)的資產(chǎn)軌道數(shù)組;

  • - (NSArray<AVAssetTrack *> *)tracksWithMediaCharacteristic:(AVMediaCharacteristic)mediaCharacteristic;返回呈現(xiàn)具有指定特征的媒體的AVAssetTrack對象的數(shù)組;

  • @property (nonatomic, readonly) NSArray<AVAssetTrackGroup *> *trackGroups返回asset中所有軌道組(不同的軌道分組)的數(shù)組;


訪問元數(shù)據(jù)相關(guān) ??
  • @property (nonatomic, readonly, nullable) AVMetadataItem *creationDate; ;獲取asset的創(chuàng)建日期须喂,該屬性可能為nil,如果創(chuàng)建日期已被asset以可轉(zhuǎn)換為NSDate對象的形式存儲典唇,則AVMetadataItem的dateValue屬性將提供一個NSDate的實例镊折。否則創(chuàng)建日期只能使用其stringValue值作為字符串值。

  • @property (nonatomic, readonly, nullable) NSString *lyrics; 提供對適合當前語言環(huán)境的asset的文字歌詞的訪問;

  • @property (nonatomic, readonly) NSArray<AVMetadataItem *> *commonMetadata; 屬性中包含著當前視頻公共密鑰空間中常見格式類型的元數(shù)據(jù);

  • @property (nonatomic, readonly) NSArray<AVMetadataItem *> *metadata屬性中包含當前視頻所有格式類型的元數(shù)據(jù);

  • @property (nonatomic, readonly) NSArray<AVMetadataFormat> *availableMetadataFormats;一組字符串介衔,每個字符串都代表資產(chǎn)可用的元數(shù)據(jù)格式;

  • - (NSArray<AVMetadataItem *> *)metadataForFormat:(AVMetadataFormat)format;根據(jù)元數(shù)據(jù)格式返回AVMetadataItem對象數(shù)組。

?

以上是常用的AVAsset屬性和方法骂因,下面就介紹其常用子類AVURLAsset的相關(guān)屬性和方法炎咖。

?
? AVURLAssetAVAsset用來從本地或遠程URL初始化資產(chǎn)的具體子類。

  • - (instancetype)initWithURL:(NSURL *)URL options:(nullable NSDictionary<NSString *, id> *)options;指定的初始化方法;其中寒波,options是包含用于自定義資產(chǎn)初始化選項的字典乘盼。有關(guān)鍵如下:

    • AVF_EXPORT NSString *const AVURLAssetPreferPreciseDurationAndTimingKey : 對應的值是一個包含在NSNumber對象中的BOOL值,表示資產(chǎn)是否應該準備好指示一個精確的持續(xù)時間俄烁,并提供準確的隨機訪問绸栅。YES,提供页屠,NO不提供粹胯。 ? 如果將nil作為options參數(shù)的值傳遞或者如果傳遞的值不是AVURLAssetPreferPreciseDurationAndTimingKey對應的@0 或者@1的時蓖柔,則默認值為NO。如果該資產(chǎn)(asset)僅用于播放风纠,由于AVPlayer在全部精度不可用時將支持按時間進行近似隨機訪問况鸣,因此缺省值為NO即可。? 如果要將資產(chǎn)插入到AVMutableComposition中竹观,則通常需要精確的隨機訪問镐捧,建議使用YES值。QuickTime電影文件和MPEG-4文件為精確計時提供了足夠的摘要信息臭增,并且不需要額外的解析來準備懂酱,一般使用NO即可,其他格式不能提供足夠的摘要信息誊抛,只有在對文件內(nèi)容進行初步檢查之后列牺,才能對其進行準確的隨機訪問。如果資產(chǎn)的URL所引用的定時媒體資源不能實現(xiàn)精確的持續(xù)時間和定時芍锚,則即使通過使用此密鑰請求精確的定時昔园,AVAsset.providesPreciseDurationAndTiming也將為NO。

    • AVF_EXPORT NSString *const AVURLAssetReferenceRestrictionsKey:設(shè)置在解析對外部媒體數(shù)據(jù)的引用時資源使用的限制并炮。 這個鍵的值是一個或多個包含AVAssetReferenceRestrictions枚舉值默刚。

    • AVF_EXPORT NSString *const AVURLAssetHTTPCookiesKey:默認情況下,AVURLAsset只能訪問適用于AVURLAsset的URL的客戶端默認cookie存儲中的cookie逃魄。 可以使用此初始化選項來補充可用于資產(chǎn)的Cookie荤西。(1、)HTTP cookie不適用于非HTTP(S)URLS伍俘。(2邪锌、)在HLS --- 流媒體中,許多HTTP請求(例如癌瘾,媒體觅丰,密鑰,變體索引)可能被發(fā)布到不同的路徑或主機妨退。在這兩種情況下妇萄,HTTP請求中任何不適用于AVURLAsset的URL的Cookie都會丟失,這個init選項允許AVURLAsset為這些HTTP(S)請求使用額外的HTTP cookie咬荷。

    • AVF_EXPORT NSString *const AVURLAssetAllowsCellularAccessKey:指示是否允許代表此資產(chǎn)的網(wǎng)絡請求使用蜂窩接口冠句。默認YES。

  • + (instancetype)URLAssetWithURL:(NSURL *)URL options:(nullable NSDictionary<NSString *, id> *)options;類方法幸乒,返回AVURLAsset的實例;

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

  • + (NSArray<AVFileType> *)audiovisualTypes返回AVURLAsset類支持的文件類型的數(shù)組;

  • + (NSArray<NSString *> *)audiovisualMIMETypes返回AVURLAsset類支持的MIME類型的數(shù)組;

  • + (BOOL)isPlayableExtendedMIMEType: (NSString *)extendedMIMEType判斷該asset是否可以使用給定的編解碼器和容器類型播放;

1懦底、MIME (Multipurpose Internet Mail Extensions) 是描述消息內(nèi)容類型的因特網(wǎng)標準。MIME 消息能包含文本罕扎、圖像聚唐、音頻丐重、視頻以及其他應用程序?qū)S玫臄?shù)據(jù)。
2拱层、一個MIME類型包括一個類型(type)弥臼,一個子類型(subtype)。此外可以加上一個或多個可選參數(shù)(optional parameter)根灯。目前已被注冊的類型名有application径缅、audioexample烙肺、image纳猪、messagemodel桃笙、multipart氏堤、textvideo搏明。具體請參考

  • @property (nonatomic, readonly) AVAssetResourceLoader *resourceLoader;獲取資產(chǎn)相關(guān)聯(lián)的資源加載器鼠锈。

  • @property (nonatomic, readonly, nullable) AVAssetCache *assetCacheiOS 10之后可用,獲取與資產(chǎn)的關(guān)聯(lián)資產(chǎn)緩存(如果存在);

  • - (nullable AVAssetTrack *)compatibleTrackForCompositionTrack:(AVCompositionTrack *)compositionTrack;返回可以將任何時間范圍插入到給定compositionTrack的資產(chǎn)軌跡星著。使用AVMutableCompositionTrack的- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError * _Nullable * _Nullable)outError方法將軌道插入购笆。該方法是AVMutableComposition的方法 --- - (nullable AVMutableCompositionTrack *)mutableTrackCompatibleWithTrack:(AVAssetTrack *)track;的補充;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虚循,隨后出現(xiàn)的幾起案子添诉,更是在濱河造成了極大的恐慌亏掀,老刑警劉巖五慈,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件己肮,死亡現(xiàn)場離奇詭異,居然都是意外死亡茎刚,警方通過查閱死者的電腦和手機襟锐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膛锭,“玉大人捌斧,你說我怎么就攤上這事∪矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵妇押,是天一觀的道長跷究。 經(jīng)常有香客問我,道長敲霍,這世上最難降的妖魔是什么俊马? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任丁存,我火速辦了婚禮,結(jié)果婚禮上柴我,老公的妹妹穿的比我還像新娘解寝。我一直安慰自己,他們只是感情好艘儒,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布聋伦。 她就那樣靜靜地躺著,像睡著了一般界睁。 火紅的嫁衣襯著肌膚如雪觉增。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天翻斟,我揣著相機與錄音逾礁,去河邊找鬼。 笑死访惜,一個胖子當著我的面吹牛嘹履,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播债热,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼砾嫉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阳柔?” 一聲冷哼從身側(cè)響起焰枢,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舌剂,沒想到半個月后济锄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡霍转,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年荐绝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片避消。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡低滩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岩喷,到底是詐尸還是另有隱情恕沫,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布纱意,位于F島的核電站婶溯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迄委,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一褐筛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叙身,春花似錦渔扎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虏两,卻和暖如春愧旦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背定罢。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工笤虫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祖凫。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓琼蚯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惠况。 傳聞我的和親對象是個殘疾皇子遭庶,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容