?視頻播放作為現(xiàn)在app端不可少的一部分,系統(tǒng)提供框架AVKit有時不能滿足我們的需求和審美释移,所以大多數(shù)情況下我們會采用自定義AVPlayer的方式來實現(xiàn)視頻播放功能。
?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)屬性和方法炎咖。
?
? AVURLAsset
是AVAsset
用來從本地或遠程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
径缅、audio
、example
烙肺、image
纳猪、message
、model
桃笙、multipart
氏堤、text
、video
搏明。具體請參考
@property (nonatomic, readonly) AVAssetResourceLoader *resourceLoader
;獲取資產(chǎn)相關(guān)聯(lián)的資源加載器鼠锈。@property (nonatomic, readonly, nullable) AVAssetCache *assetCache
iOS 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;
的補充;