AVPlayer視頻播放之 - AVPlayerItem

?AVPlayerItem:該類主要是用于管理資源對象,提供播放數(shù)據(jù)源,旨在表示由AVPlayer播放的資產(chǎn)的呈現(xiàn)狀態(tài),并允許觀察該狀態(tài),它控制著視頻從創(chuàng)建到銷毀的諸多狀態(tài)。

  • + (instancetype)playerItemWithURL:(NSURL *)URL / - (instancetype)initWithURL:(NSURL *)URL根據(jù)URL初始化對象;

  • + (instancetype)playerItemWithAsset:(AVAsset *)asset / - (instancetype)initWithAsset:(AVAsset *)asset根據(jù)Asset初始化對象,相當(dāng)于+ playerItemWithAsset:automatedLoadedAssetKeys :,傳遞@ [@“duration”]作為自動調(diào)用的關(guān)鍵字值;

  • + (instancetype)playerItemWithAsset:(AVAsset *)asset automaticallyLoadedAssetKeys:(nullable NSArray<NSString *> *)automaticallyLoadedAssetKeys / - (instancetype)initWithAsset:(AVAsset *)asset automaticallyLoadedAssetKeys:(nullable NSArray<NSString *> *)automaticallyLoadedAssetKeys 參數(shù)automaticallyLoadedAssetKeys 是NSStrings的NSArray,每個NSString表示由AVAsset定義的屬性鍵,例如durationpreferredRate等;

  • @property (nonatomic, readonly) AVPlayerItemStatus status; 這個屬性的值是一個AVPlayerItemStatus,它指示接收器是否可以用于播放,一般為可以播放。最重要的需要觀察的屬性??!當(dāng)你第一次創(chuàng)建AVPlayerItem時,其狀態(tài)值為AVPlayerItemStatusUnknown,表示其媒體尚未加載,尚未排入隊(duì)列進(jìn)行播放。將AVPlayerItem與 AVPlayer相關(guān)聯(lián)后會立即開始排列該項(xiàng)目的媒體并準(zhǔn)備播放,但是在準(zhǔn)備好使用之前,需要等到其狀態(tài)變?yōu)锳VPlayerItemStatusReadyToPlay;

typedef NS_ENUM(NSInteger, AVPlayerItemStatus) {
    AVPlayerItemStatusUnknown,  //表示播放器項(xiàng)目的狀態(tài)尚未知道,因?yàn)樗形磭L試加載新媒體資源進(jìn)行播放
    AVPlayerItemStatusReadyToPlay, //表示播放器項(xiàng)目已準(zhǔn)備好播放
    AVPlayerItemStatusFailed //表示AVPlayerItem由于錯誤而不能再播放
};
  • @property (nonatomic, readonly, nullable) NSError *error;如果接收者的狀態(tài)是AVPlayerItemStatusFailed,則描述導(dǎo)致失敗的錯誤,否則為nil;

  • @property (nonatomic, readonly) AVAsset *asset;獲取初始化期間提供的資產(chǎn);

  • @property (nonatomic, readonly) NSArray<AVPlayerItemTrack *> *tracks;提供AVPlayerItem音軌數(shù)組。 可觀察(可在播放期間動態(tài)更改);

  • @property (nonatomic, readonly) CMTime duration ;媒體的持續(xù)時間,可觀察(可在播放期間動態(tài)更改)。直到asset被加載完成前,此屬性的值將返回為kCMTimeIndefinite(使用這個常量初始化一個不確定的CMTime ---- 如一個實(shí)況廣播的持續(xù)時間,不要使用[time == kCMTimeIndefinite]對此進(jìn)行測試);
    ?有兩種方法使可以確保該值只有在可用時才能被訪問:

    • 等待AVPlayerItem的status屬性值為AVPlayerItemStatusReadyToPlay后使用。

    • 注冊屬性的鍵值觀察,請求初始值。 如果初始值為kCMTimeIndefinite,則AVPlayerItem一旦知道它的值就會通過鍵值觀察通知你其持續(xù)時間的可用性。

關(guān)于AVAsset的duration和AVPlayerItem的duration的區(qū)別請參考 : 官方文檔描述

  • @property (nonatomic, readonly) CGSize presentationSize;播放器提供的接收器的大小,可觀察,該屬性可以在任何時候訪問,但是在asset已經(jīng)AVPlayerItemStatusReadyToPlay前會是CGSizeZero;

  • @property (nonatomic, readonly, nullable) NSArray<AVMetadataItem *> *timedMetadata;提供一個AVMetadataItems的NSArray,表示媒體播放時最近遇到的定時元數(shù)據(jù),可能是nil;

  • @property (nonatomic, readonly) NSArray<NSString *> *automaticallyLoadedAssetKeys獲取在AVPlayerItem到達(dá)AVPlayerItemStatusReadyToPlay狀態(tài)前自動加載AVAsset的keys;

播放信息相關(guān)?

  • @property (nonatomic, readonly) BOOL canPlayFastForward 7.0前表示播放速度是否可以在1.0-2.0之間播放。7.0后表示播放速度是否可以大于2.0,即使該屬性為NO,播放速度也可以在1.0-2.0之間播放;

  • @property (nonatomic, readonly) BOOL canPlaySlowForward是否可以再0.0-1.0之間播放;

  • @property (nonatomic, readonly) BOOL canPlayReverse是否可以以-1.0的速度播放;

  • @property (nonatomic, readonly) BOOL canPlaySlowReverse是否可以在-1.0 - 0.0之間的速度播放;

  • @property (nonatomic, readonly) BOOL canPlayFastReverse是否可以低于-1.0的速度播放;

  • @property (nonatomic, readonly) BOOL canStepForward是否支持快進(jìn),一旦AVPlayerItem的status變?yōu)锳VPlayerItemStatusReadyToPlay,該值將不會再變;

  • @property (nonatomic, readonly) BOOL canStepBackward是否支持快退,一旦AVPlayerItem的status變?yōu)锳VPlayerItemStatusReadyToPlay,該值將不會再變;

  • @property (nonatomic, readonly) NSArray<NSValue *> *loadedTimeRanges已加載Item的時間范圍;

  • @property (nonatomic, readonly, getter=isPlaybackLikelyToKeepUp) BOOL playbackLikelyToKeepUp指示該item是否能無延遲播放,用于監(jiān)聽緩存足夠播放的狀態(tài),在這里,當(dāng)屬性playbackBufferFull指示YES時,可能是playbackLikelyToKeepUp指示NO。 在這種情況下,播放緩存已經(jīng)達(dá)到了容量,但是沒有統(tǒng)計數(shù)據(jù)來支持,所以播放可能持續(xù),所以這里需要程序員決定是否繼續(xù)媒體播放;

  • @property (nonatomic, readonly, getter=isPlaybackBufferFull) BOOL playbackBufferFull緩存區(qū)是否已經(jīng)滿了,并且進(jìn)一步的I / O是否被掛起;

  • @property (nonatomic, readonly, getter=isPlaybackBufferEmpty) BOOL playbackBufferEmpty指示播放是否消耗了所有緩沖媒體,播放將停止或結(jié)束;

  • @property (nonatomic, assign) BOOL canUseNetworkResourcesForLiveStreamingWhilePausedNS_AVAILABLE(10_11, 9_0) 指示播放器項(xiàng)目是否可以使用網(wǎng)絡(luò)資源在暫停時使播放狀態(tài)保持最新狀態(tài),對于直播內(nèi)容,PlayerItem可能需要使用額外的網(wǎng)絡(luò)和電源,以使播放狀態(tài)在暫停時保持最新狀態(tài)。 例如,當(dāng)此屬性設(shè)置為YES時,seekableTimeRanges屬性將定期更新以反映實(shí)時流的當(dāng)前狀態(tài),iOS 9后默認(rèn)為NO;

  • @property (nonatomic) NSTimeInterval preferredForwardBufferDuration NS_AVAILABLE(10_12, 10_0)指示播放器在播放頭之前緩沖媒體的持續(xù)時間,以防止播放中斷。該屬性定義了首選的前向緩沖區(qū)持續(xù)時間(秒)。如果設(shè)置為0,播放器將為大多數(shù)使用情況選擇適當(dāng)?shù)木彌_級別。將此屬性設(shè)置為較低值會增加播放停頓和重新緩沖的機(jī)會,而將其設(shè)置為較高值會增加對系統(tǒng)資源的需求;

  • @property (nonatomic) double preferredPeakBitRate NS_AVAILABLE(10_10, 8_0)此item的網(wǎng)絡(luò)帶寬消耗限制(以每秒位數(shù)為單位);

  • @property (nonatomic) CGSize preferredMaximumResolution NS_AVAILABLE(10_13, 11_0)指示播放器下載和呈現(xiàn)的視頻的分辨率的首選上限。
    默認(rèn)值為CGSizeZero,表示客戶端對視頻分辨率沒有限制。 其他值表示首選的最大視頻分辨率。僅適用于HTTP Live Streaming asset;

時間控制?

  • - (CMTime)currentTime;返回AVPlayerItem的當(dāng)前時間;

  • @property (nonatomic) CMTime forwardPlaybackEndTime指定播放速率為正值時播放結(jié)束的時間,默認(rèn)值為kCMTimeInvalid,表示沒有指定前向播放的結(jié)束時間。在這種情況下,正向播放的有效結(jié)束時間是持續(xù)時間。到達(dá)結(jié)束時間時,接收者將發(fā)布AVPlayerItemDidPlayToEndTimeNotification通知,速率為負(fù)時,此屬性的值對播放沒有影響;

  • @property (nonatomic) CMTime reversePlaybackEndTime指定播放速度為負(fù)數(shù)時播放結(jié)束的時間。默認(rèn)值是kCMTimeInvalid,表示沒有指定反向播放的結(jié)束時間。
    在這種情況下,反向播放的有效結(jié)束時間是kCMTimeZero。到達(dá)結(jié)束時間時,接收者將發(fā)布AVPlayerItemDidPlayToEndTimeNotification通知,速率為正時,此屬性的值對播放沒有影響;

  • @property (nonatomic, readonly) NSArray<NSValue *> *seekableTimeRanges該屬性提供一個AVPlayerItem能找到的時間范圍集合,其中元素是CMTimeRange結(jié)構(gòu)體中的NSValue
    對象,返回的時間范圍可能是不連續(xù)的;

  • - (void)seekToTime:(CMTime)time completionHandler:(void (^_Nullable)(BOOL finished))completionHandler使用此方法可以查找項(xiàng)目的指定時間,并在搜索操作已完成或中斷時執(zhí)行指定的塊。如果seekTime在seekableTimeRanges屬性指示的可尋址時間范圍之外,那么查找請求將被取消,完成處理程序?qū)⒈徽{(diào)用,完成的參數(shù)設(shè)置為NO,如果查找請求完成而不被中斷,則提供的完成處理程序?qū)⑹褂胒inished參數(shù)設(shè)置為YES。如果在調(diào)用此方法時另一個查找請求已在進(jìn)行中,則正在進(jìn)行的查找請求立即調(diào)用,并將finished參數(shù)設(shè)置為NO;

  • - (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter completionHandler:(void (^_Nullable)(BOOL finished))completionHandler查找的時間將在[time -toleranceBefore,time+ toleranceAfter],將kCMTimeZero傳遞給toleranceBefore和toleranceAfter以請求采樣精確查找,這可能會導(dǎo)致額外的解碼延遲。全部傳遞kCMTimePositiveInfinity,則與seekToTime:方法相同;

  • - (void)cancelPendingSeeks使用此方法取消并釋放掛起的搜索的完成處理程序。 完成處理程序的完成參數(shù)將被設(shè)置為NO;

  • - (nullable NSDate *)currentDate如果currentTime映射到特定的(實(shí)時)日期存在,則返回當(dāng)前播放的日期;如果播放未映射到任何日期,則返回nil;

  • - (BOOL)seekToDate:(NSDate *)date completionHandler:(void (^_Nullable)(BOOL finished))completionHandler與seekToTime相似;

  • - (void)stepByCount:(NSInteger)stepCount將AVPlayerItem的currentTime向前或向后移動指定的步數(shù),正數(shù)前進(jìn),負(fù)數(shù)后退。 每個步數(shù)的大小取決于AVPlayerItem啟用的AVPlayerItemTracks對象;

視頻視覺效果及音頻設(shè)置相關(guān)?

  • @property (nonatomic, copy, nullable) AVVideoComposition *videoComposition播放期間應(yīng)用的視頻合成設(shè)置;

  • @property (nonatomic, readonly, nullable) id<AVVideoCompositing> customVideoCompositor獲取自定義的視頻合成器,如果沒有視頻合成器,或者內(nèi)部視頻合成器正在使用,則此屬性為nil;

  • @property (nonatomic) BOOL seekingWaitsForVideoCompositionRendering指示在搜索視頻作品時,AVPlayerItem的時間是否跟隨顯示的視頻幀。一般設(shè)置為NO,此屬性對videoComposition為nil的項(xiàng)目沒有影響;

  • @property (nonatomic, copy, nullable) NSArray<AVTextStyleRule *> *textStyleRules代表文本樣式的AVTextStyleRules數(shù)組,可應(yīng)用于字幕和其他易讀的媒體,數(shù)組中的每個AVTextStyleRule對象中包含的樣式信息僅在正在播放的媒體資源沒有指定文本樣式時使用,此屬性僅對媒體子類型為kCMSubtitleFormatType_WebVTT的音軌有效;

  • @property (nonatomic, copy) AVAudioTimePitchAlgorithm audioTimePitchAlgorithm用于管理縮放音頻編輯音頻音調(diào)的處理算法,系統(tǒng)給出四種:

    • AVF_EXPORT AVAudioTimePitchAlgorithm const AVAudioTimePitchAlgorithmLowQualityZeroLatencyiOS下默認(rèn)方式,音頻質(zhì)量低,適合短暫的快進(jìn)/倒帶效果。 速率捕捉到{0.5,0.6666667,0.8,1.0,1.25,1.5,2.0}這六個數(shù)值;

    • AVF_EXPORT AVAudioTimePitchAlgorithm const AVAudioTimePitchAlgorithmTimeDomain音頻質(zhì)量適中,適合聲音。 可變率從1/32到32;

    • AVF_EXPORT AVAudioTimePitchAlgorithm const AVAudioTimePitchAlgorithmVarispeed音頻質(zhì)量高,沒有音調(diào)校正,音調(diào)隨速率而變化。 可變率從1/32到32;

    • AVF_EXPORT AVAudioTimePitchAlgorithm const AVAudioTimePitchAlgorithmSpectralOS X下默認(rèn)方式,音頻質(zhì)量最高,計算成本最高,適合音樂。 可變率從1/32到32;

  • @property (nonatomic, copy, nullable) AVAudioMix *audioMix播放期間要應(yīng)用的音頻混合參數(shù),音頻混合只能用于基于文件的媒體(本地文件),不支持與使用HTTP實(shí)時流傳輸?shù)拿襟w一起使用,VAudioMix的inputParameters屬性中必須具有對應(yīng)于接收者assetTrack的trackID,否則將被忽略;

媒體選擇相關(guān)?

  • - (void)selectMediaOption:(nullable AVMediaSelectionOption *)mediaSelectionOption inMediaSelectionGroup:(AVMediaSelectionGroup *)mediaSelectionGroup選擇指定AVMediaSelectionGroup中指定的AVMediaSelectionOption實(shí)例所描述的媒體選項(xiàng),并取消選擇該組中的所有其他選項(xiàng),如果mediaSelectionOption不是mediaSelectionGroup成員,則不會改變呈現(xiàn)狀態(tài),如果AVMediaSelectionGroup的allowsEmptySelection屬性的值為YES,則可以將nil傳遞給mediaSelectionOption參數(shù)以取消選擇組中的所有媒體選擇選項(xiàng);

  • - (void)selectMediaOptionAutomaticallyInMediaSelectionGroup:(AVMediaSelectionGroup *)mediaSelectionGroup選擇與AVPlayer的自動選擇條件最匹配的指定媒體選擇組中的媒體選項(xiàng)。除非相關(guān)AVPlayer的applyMediaSelectionCriteriaAutomatically屬性為YES且已經(jīng)復(fù)寫 - [AVPlayerItem selectMediaOption:inMediaSelectionGroup:]方法,否則該方法不起作用;

  • @property (nonatomic, readonly) AVMediaSelection *currentMediaSelection NS_AVAILABLE(10_11, 9_0)獲取當(dāng)前媒體組的媒體選擇;

日志相關(guān)?

  • - (nullable AVPlayerItemAccessLog *)accessLog返回表示網(wǎng)絡(luò)訪問日志快照的對象,可以為nil。新的日志記錄信息可用時,將發(fā)布AVPlayerItemNewAccessLogEntryNotification通知 ;

  • - (nullable AVPlayerItemErrorLog *)errorLog返回表示錯誤日志快照的對象,可以為nil;

輸出相關(guān)?

  • - (void)addOutput:(AVPlayerItemOutput *)output將指定的AVPlayerItemOutput實(shí)例添加到接收方的輸出集合中,提供的AVPlayerItemOutput類決定了解碼樣本的數(shù)據(jù)結(jié)構(gòu);

  • - (void)removeOutput:(AVPlayerItemOutput *)output移除指定的的播放器項(xiàng)目輸出對象;

  • @property (nonatomic, readonly) NSArray<AVPlayerItemOutput *> *outputs獲取與AVPlayerItem相關(guān)的輸出對象;

輸出相關(guān)(9.3以后可用)?

  • - (void)addMediaDataCollector:(AVPlayerItemMediaDataCollector *)collector將指定的AVPlayerItemMediaDataCollector實(shí)例添加到接收者的mediaDataCollectors集合中,這可能會導(dǎo)致額外的I / O異步收集請求的媒體數(shù)據(jù);

  • - (void)removeMediaDataCollector:(AVPlayerItemMediaDataCollector *)collector移除指定的AVPlayerItemMediaDataCollector實(shí)例;

  • @property (nonatomic, readonly) NSArray<AVPlayerItemMediaDataCollector *> *mediaDataCollectors獲取相關(guān)聯(lián)的所有AVPlayerItemMediaDataCollector實(shí)例;

以下是涉及的通知:

  • AVF_EXPORT NSString *const AVPlayerItemTimeJumpedNotificationAVPlayerItem的currentTime發(fā)生變化時發(fā)布;

  • AVF_EXPORT NSString *const AVPlayerItemDidPlayToEndTimeNotificationAVPlayerItem播放到結(jié)束時發(fā)布;

  • AVF_EXPORT NSString *const AVPlayerItemFailedToPlayToEndTimeNotification當(dāng)該物品未能播放到其結(jié)束時間就中斷時發(fā)布;

  • AVF_EXPORT NSString *const AVPlayerItemPlaybackStalledNotification暫停時發(fā)布;

  • AVF_EXPORT NSString *const AVPlayerItemNewAccessLogEntryNotification在新的訪問日志被添加條目時發(fā)布;

  • AVF_EXPORT NSString *const AVPlayerItemNewErrorLogEntryNotification在新的錯誤日志被添加條目時發(fā)布;

  • AVF_EXPORT NSString *const AVPlayerItemFailedToPlayToEndTimeErrorKey該鍵是從AVPlayerItemTimeJumpedNotification通知的用戶信息字典中檢索錯誤對象(NSError)的鍵;

?該類對于視頻播放的各種狀態(tài)監(jiān)控特別重要,除了按上面的通知外還有幾個重要的屬性需要使用KVO去進(jìn)行處理?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容