Media Assets, Playback, and Editing 訪問和檢查媒體資源; 隊列媒體用于播放和自定義播放行為; 編輯和組合資源; 導入和導出原始媒體流。
1、媒體資源
1.1、關于 Asset
模型
Asset
如何用作媒體播放器的構建模塊?
AVFoundation
的許多關鍵特性和功能與播放和處理媒體資源有關。該框架使用AVAsset
類對資源建模,AVAsset
類是表示單個媒體資源的抽象不可變類型:它提供了媒體資源的合成視圖,對整個媒體的靜態方面進行建模。AVAsset
的實例可以對基于文件的本地媒體進行建模,例如QuickTime電影或MP3音頻文件,但也可以表示從遠程主機逐步下載的資源或使用 HTTP Live Streaming (HLS) 流媒體。
AVAsset
以兩種重要方式簡化了與媒體的協作。首先,它與資源格式無關聯:提供了一個一致的接口來管理并與媒體交互,而不管其底層類型如何;使用容器格式和編解碼器類型的詳細信息留給框架,讓我們專注于在應用程序中使用這些資源的方式。
其次,它與資源位置無關聯:使用媒體的URL
創建AVAsset
實例。這可以是本地URL
:如包含在應用程序包中或文件系統上其他位置的URL
;也可以是資源:如存儲在遠程服務器上的HLS流。在任何一種情況下,AVFoundation
都會及時執行有效檢索和加載資源所需的工作。
將AVAsset
獨立于資源格式和資源位置,大大簡化了使用視聽媒體的過程。
AVAsset
是一個容器對象,由一個或多個AVAssetTrack
實例組成,它為資源的統一類型媒體流建模。最常用的軌道類型是音頻軌道和視頻軌道,但AVAssetTrack
還對其他軌道建模,例如隱藏式字幕,字幕和定時元數據。
使用AVAsset
的tracks
屬性檢索資源的軌道集合。在許多情況下,需要對資源軌道的子集執行操作,而不是對其完整集合執行操作:在這些情況下,AVAsset
還提供了基于標識符,媒體類型或特征等標準來檢索軌道子集的方法。
AVAsset
資源庫里的資源;
AVAssetTrac
資源的軌道;
1.2、處理資源
檢索要用于回放的資源或獲取有關資源的信息:例如,資產的播放時間。
1.2.1、資源信息
AVAssetCache 繼承自NSObject
,用于檢查本地緩存的媒體資源。iOS 10
之后,可以使用AVAssetDownloadURLSession
和AVAssetDownloadTask
類將HTTP Live Streaming資源下載到iOS設備。可以使用下載資源關聯的AVAssetCache
檢查其本地緩存的媒體數據
/* 是否離線播放AVAsset
* 在離線播放之前查詢此值,確定它是否可供使用。
* YES并不代表所有資源的相關媒體選擇選項都可以離線播放。
* 調用- mediaSelectionOptionsInMediaSelectionGroup:確定哪些媒體選擇選項可以離線播放。
*/
@property(nonatomic, readonly, getter=isPlayableOffline) BOOL playableOffline;
//查詢可用于離線播放本地緩存的媒體選項。
- (NSArray<AVMediaSelectionOption *> *)mediaSelectionOptionsInMediaSelectionGroup:(AVMediaSelectionGroup *)mediaSelectionGroup;
AVFragmentedAsset : AVURLAsset 可以在不修改先前存在的數據結構的情況下在總持續時間內擴展。
AVFragmentedAssetMinder : NSObject 定期檢查是否已將其他fragmentedAsset添加到AVFragmentedAsset。
1.2.2、軌道信息
AVAsynchronousKeyValueLoading 該協議使用資源asset或資源軌道assetTrack而不阻塞調用線程
AVAssetTrackGroup : NSObject asset中的一組相關軌道:一次只能播放其中一個。該數組通常包含相同內容的變體,例如多個翻譯中的字幕。通過AVAsset的trackGroups屬性來檢查asset中包含的軌道組。
AVAssetTrackSegment : NSObject 資源軌道assetTrack的一部分
AVFragmentedAssetTrack : AVAssetTrack 用于處理fragmentedAsset的軌道
1.2.3、檢索資源asset
AVURLAsset : AVAsset 用于從本地或遠程URL創建資源
AVAssetDownloadURLSession : NSURLSession 用于下載資源
AVAssetResourceLoader : NSObject 協調資源請求:從AVURLAsset對象的resourceLoader屬性中獲取該對象,并實現AVAssetResourceLoaderDelegate協議;參閱AVARLDelegateDemo
1.3、asset文件導入和導出
從文件夾導入現有媒體數據;將新的、修改的或現有的媒體數據導出到文件夾。
1.3.1、文件導入
AVAssetReader : NSObject 閱讀器,用于獲取asset的媒體數據,基于文件或由來自多個源媒體數據的集合組成。
1.3.2、文件導出
將視頻導出為其他格式
AVAssetExportSession : NSObject 對asset的內容進行編碼,以創建指定exportPreset所描述格式的輸出
2、媒體合成與編輯
將多個音頻和視頻軌道合成單個組合;編輯電影。
2.1、媒體合成
AVComposition 繼承自AVAsset
,將來自多個基于源文件的媒體數據組合在一起顯示,或處理來自多個源媒體數據。
在其頂層,AVComposition
是軌道的集合,每個軌道根據時間表呈現特定媒體類型的媒體:例如音頻或視頻。每個軌道由AVCompositionTrack
的實例表示。每個軌道由一系列軌道片段組成,由AVCompositionTrackSegment
實例表示。每個片段存儲由URL、軌道標識符和時間映射指定的源容器中的一部分媒體數據。 URL指定源容器,軌道標識符指示要呈現的源容器的軌道。無論容器類型如何,所有基于文件的視聽Asset
都可以組合在一起。
時間映射指定要呈現的源軌道的時間范圍,并且還指定其在合成軌道中的呈現的時間范圍。如果時間映射的源和目標范圍的時長相同,則片段的媒體數據將以其自然速率呈現。否則,該段將以與 source.duration/target.duration
之比相等的速率呈現。
可以使用AVCompositionTrack
的segments
屬性訪問軌道的軌道片段。具有每個媒體類型信息的軌道集合,以及每個包含其軌道片段數組(URL、音軌標識符和時間映射)的軌道,構成了組合的完整低級表示。這種表示可以由客戶端以任何方便的形式寫出,隨后可以通過使用適當媒體類型的AVMutableCompositionTrack
對象實例化新的AVMutableComposition
來,每個對象的segment
屬性根據存儲的URL數組、跟蹤標識符和時間映射設置,從而重新組合。
AVMutableComposition
和AVMutableCompositionTrack
也提供了構建組合的高級接口,提供插入、刪除和縮放操作,而無需直接操作合成軌道的trackSegment
數組。這個接口使用更高級的結構,如AVAsset
和AVAssetTrack
,允許客戶端使用與它創建的候選源相同的引用,以便在合成之前檢查或預覽它們。
AVMutableComposition 繼承自AVComposition
,用于從現有Asset
創建新合成的可變對象。該類提供了添加和刪除軌道的功能,可以添加、刪除和縮放時間范圍。可以對一個可變組合做一個不可變的快照,以便回放或檢查。
AVCompositionTrack 繼承自AVAssetTrack
,該軌道由媒體類型,軌道標識符和軌道片段組成。
AVMutableCompositionTrack 繼承自AVCompositionTrack
,合成對象中的可變軌道,用于插入,移除和縮放軌道片段,而不會影響其低級別表示。
AVCompositionTrack
定義了軌道段時間對齊的約束。如果在可變組合中設置軌道段數組,則可以使用-validateTrackSegments:error:
測試這些段是否滿足約束條件。
AVCompositionTrackSegment 繼承自AVAssetTrackSegment
,AVAssetTrack
的一個片段,由URL,軌道標識符和從源軌道到合成軌道的時間映射組成。通常使用這個類將AVComposition
的低級表示形式保存到選擇的存儲格式中,并從存儲中重新構造它們。
2.2、視頻合成
AVVideoComposition 繼承自NSObject
,用于視頻合成;視頻合成在其指令的聚合時間范圍內的任何時間描述了用于產生對應于該時間的合成視頻幀的視頻軌道的數量和ID。當使用AVFoundation
的內置視頻合成器時,AVVideoComposition
包含的指令可以為每個視頻源指定空間變換,不透明度值和裁剪矩形,并且這些指令可以通過簡單的線性漸變功能隨時間變化。
通過實現AVVideoCompositing
協議,可以實現自己的自定義視頻合成程序;自定義視頻合成程序在回放和其他操作期間為其每個視頻源提供像素緩沖區,并可以對其執行任意圖形操作以產生可視輸出。
AVMutableVideoComposition 繼承自AVVideoComposition
,用于視頻合成。
AVVideoCompositionInstruction 繼承自NSObject
,封裝了一組操作指令,由AVVideoComposition
對象使用這些指令合成視頻。
AVMutableVideoCompositionInstruction 繼承自AVVideoCompositionInstruction
,封裝了一組操作指令,由AVVideoComposition
對象使用這些指令合成視頻。
AVAsynchronousCIImageFilteringRequest 繼承自NSObject
,使用Core Image
過濾器處理AVVideoComposition
中的單個視頻幀:如添加濾鏡、裁剪視頻幀等操作。
AVAsynchronousVideoCompositionRequest 繼承自NSObject
,包含AVVideoComposition
渲染輸出像素緩沖區信息。
AVVideoCompositionLayerInstruction 繼承自NSObject
,設置AVVideoComposition
中指定軌道的不透明度opacity
、旋轉矩陣變換transform
和裁剪cropping
。
AVMutableVideoCompositionLayerInstruction 繼承自AVVideoCompositionLayerInstruction
,設置AVVideoComposition
中指定軌道的不透明度opacity
、旋轉矩陣變換transform
和裁剪cropping
。
AVVideoCompositionCoreAnimationTool 繼承自NSObject
,將Core Animation
合并到AVVideoComposition
中。
AVVideoCompositionRenderContext 繼承自NSObject
,該實例從緩沖池中提供像素緩沖區信息:如大小和縮放。
2.3、編輯movie
AVMutableMovie 繼承自AVMovie
, 符合QuickTime或基于ISO的媒體文件格式的視聽容器。
AVMutableMovieTrack 繼承自AVMovieTrack
,符合QuickTime或基于ISO的媒體文件格式的軌道。
2.4、混音
AVAudioMix 繼承自NSObject
,管理混合音頻軌道的輸入參數;允許在播放或其他操作期間在音頻軌道上執行自定義音頻處理
AVMutableAudioMix 繼承自AVAudioMix
,管理混合音軌的輸入參數;允許在播放或其他操作期間在音軌上執行自定義音頻處理
AVAudioMixInputParameters 繼承自NSObject
,表示添加到混合音頻軌道時應該應用到音頻軌道的參數。
AVMutableAudioMixInputParameters 繼承自AVAudioMixInputParameters
,表示添加到混合音頻軌道時應該應用到音頻軌道的參數。
3、處理元數據
3.1、檢索元數據
檢索并過濾與asset
關聯的所有元數據。
媒體容器格式存儲有關其媒體的描述性元數據。作為開發人員,處理元數據常常很有挑戰性,因為每種容器格式都有自己獨特的元數據格式。通常,對格式有所理解才能讀取和編寫容器的元數據,但是AVFoundation
通過使用AVMetadataItem
類簡化了對元數據的處理。
在最基本的形式中,AVMetadataItem
的實例是一個鍵值對,表示單個元數據值,例如電影的標題或專輯的插圖。與AVAsset
提供媒體的規范化視圖相同,AVMetadataItem
也提供相關元數據的規范化視圖。
3.1.1、加載asset的元數據
通過查詢asset
的availableMetadataFormats
屬性確定其包含的元數據格式。此屬性為其包含的每個元數據格式返回一個字符串標識符數組。然后調用-metadataForFormat:
方法檢索特定格式的元數據值,如下所示:
NSURL *url = [NSURL fileURLWithPath:@""];
AVAsset *asset = [AVAsset assetWithURL:url];
NSString *formatsKey = @"availableMetadataFormats";
[asset loadValuesAsynchronouslyForKeys:@[formatsKey] completionHandler:^{
NSError *error = nil;
AVKeyValueStatus status = [asset statusOfValueForKey:formatsKey error:&error];
if (status == AVKeyValueStatusLoaded) {
[asset.availableMetadataFormats enumerateObjectsUsingBlock:^(AVMetadataFormat _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSArray<AVMetadataItem *> *metadataItem = [asset metadataForFormat:obj];
//處理特定格式的元數據集合
}];
}
}];
3.1.2、過濾元數據集合
檢索完元數據集合后,下一步是查找指定值。使用AVMetadataItem
的各種類方法來將元數據集合過濾到一組離散值。
查找指定元數據項的最簡單方法是按標識符進行篩選,標識符將字典和鍵分組到一個單元中。以下示例顯示如何從公共鍵空間檢索標題項:
NSArray<AVMetadataItem *> *commonMetadata = asset.commonMetadata;
AVMetadataIdentifier titleID = AVMetadataCommonIdentifierTitle;
NSArray<AVMetadataItem *> *titleItems = [AVMetadataItem metadataItemsFromArray:commonMetadata filteredByIdentifier:titleID];
AVMetadataItem *titleItem = titleItems.firstObject;
if (titleItem) {
//處理標題項
}
AVMetadataItem
的過濾方法返回項的集合,而不是單個實例。在許多情況下,返回的集合包含單個元素,但如果媒體包含本地化元數據,或者正在從公共鍵空間檢索數據,并且多個鍵空間中存在相同的值,則返回一個與每個區域設置或鍵空間匹配的不同值。
3.1.3、查找指定值
在檢索了特定的元數據項之后,下一步是調用它的value
屬性。返回的值是采用NSObject
和NSCopying
協議的對象類型。可以手動將值轉換為適當的類型,但是使用元數據項的類型強制屬性更安全也更容易。可以使用它的stringValue
、numberValue
、dateValue
和dataValue
屬性輕松地將值強制轉換為適當的類型。例如,下面展示了如何檢索與iTunes音樂音頻軌道相關聯的原圖:
NSArray<AVMetadataItem *> *commonMetadata = asset.commonMetadata;
//過濾元數據以查找asset的原圖
NSArray<AVMetadataItem *> *artworkItems = [AVMetadataItem metadataItemsFromArray:commonMetadata filteredByIdentifier:AVMetadataCommonIdentifierArtwork];
AVMetadataItem *artworkItem = artworkItems.firstObject;
if (artworkItem) {
//使用NSData的dataValue屬性將值強制轉換為NSData
NSData *imageData = [artworkItem dataValue];
if (imageData) {
UIImage *image = [UIImage imageWithData:imageData];
//處理圖片
}else{
//沒有找到圖片數據
}
}
3.2、AVMetadataItem
AVMetadataItem 繼承自NSObject
,與視聽asset
或其中一個軌道相關聯的元數據項。
要有效地使用AVMetadataItem
,需要了解AVFoundation
如何組織元數據。為簡化查找和過濾元數據項,AVFoundation
框架將相關元數據分組到鍵空間:
- 指定格式的鍵空間:該框架定義了許多指定格式的鍵空間,它們大致與特定容器或文件格式相關,例如QuickTime(Quicktime元數據和用戶數據)或MP3(ID3)。但是,單個
asset
可能包含跨多個鍵空間的元數據值。要檢索asset
的特定格式元數據的完整集合,請使用其元數據屬性。 - 共用的鍵空間:有許多公共元數據值,例如電影的創建日期或描述,可以存在于多個鍵空間中。為了幫助規范化對此公共元數據的訪問,該框架提供了一個公共鍵空間,可以訪問幾個鍵空間共有的有限元數據值集。這使得檢索常用元數據變得容易,而無需考慮特定格式。要檢索
asset
的公共元數據集合,請使用其commonMetadata
屬性。
元數據項的鍵符合繪制它們的容器格式規范。AVFoundation
支持的元數據格式、元數據鍵和元數據鍵空間的詳細信息可以在AVMetadataKeySpace
和AVMetadataKey
中找到。
要懶加載元數據項的值,可以使用AVAsynchronousKeyValueLoading
協議中的方法異步加載。AVAsset
類和其他類依次懶地提供它們的元數據,從這些數組中獲取對象,而不會對最終未檢查的項造成開銷。
要過濾元數據項的數組,可以使用此類的方法。例如,按鍵和鍵空間、區域設置和首選語言進行過濾。
3.3、
AVMutableMetadataItem 繼承自AVMetadataItem
,與視聽asset
或其中一個軌道相關聯的元數據項。可以從現有的AVMetadataItem
對象或使用元數據項的一個或多個基本屬性(鍵、鍵空間、語言設置)初始化可變元數據項。
AVMetadataGroup 繼承自NSObject
,與時間軸段關聯的元數據項的集合。
AVDateRangeMetadataGroup 繼承自AVMetadataGroup
,在指定日期范圍內有效使用的元數據項集合。
AVTimedMetadataGroup 繼承自AVMetadataGroup
,在指定時間范圍內有效使用的元數據項集合。例如,AVTimedMetadataGroups
用于表示章節,可選地包含章節標題和章節圖像的元數據項。
AVMutableTimedMetadataGroup 繼承自AVTimedMetadataGroup
,在指定時間范圍內有效使用的元數據項集合。
AVMetadataItemFilter 繼承自NSObject
,從元數據項篩選指定信息。
AVMetadataItemValueRequest 繼承自NSObject
,用于響應以加載元數據項值的請求。
AVMetadataFormat 定義的元數據格式。
4、媒體播放
4.1、響應播放狀態變化
AVPlayer
和AVPlayerItem
的狀態經常變化,使用KVO觀察和響應這些狀態變化。
4.1.1、監聽播放狀態
監聽AVPlayerItem
的status
屬性,該屬性指示AVPlayerItem
是否已準備好播放。首次創建AVPlayerItem
時,其狀態值為AVPlayerItemStatusUnknown
,表示其媒體尚未加載或已排入隊列進行播放。當AVPlayerItem
與AVPlayer關聯時,它會立即開始排隊該項的媒體并準備播放。當狀態值更改為AVPlayerItemStatusReadyToPlay
時,AVPlayerItem
即可使用。以下示例展示了如何監聽這種狀態變化:
{
AVAsset *_asset;
AVPlayerItem *_playerItem;
AVPlayer *_player;
}
int playerItemContext = 0;
- (void)prepareToPlay
{
NSURL *url = [NSURL fileURLWithPath:@""];
NSArray<NSString *> *requiredAssetKeys = @[@"playable",@"hasProtectedContent"];//要自動加載的asset鍵
_asset = [AVAsset assetWithURL:url];
//使用asset創建一個新的AVPlayerItem
_playerItem = [AVPlayerItem playerItemWithAsset:_asset automaticallyLoadedAssetKeys:requiredAssetKeys];
//注冊監聽playerItem的status屬性
[_playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:&playerItemContext];
//將playerItem與player聯系起來
_player = [AVPlayer playerWithPlayerItem:_playerItem];
}
-prepareToPlay
方法通過調用-addObserver:forKeyPath:options:context:
方法注冊監聽playerItem
的status
屬性。在將playerItem
與player
聯系之前調用此方法,以監聽status
屬性所有狀態更改。
4.1.2、響應狀態改變
我們已經注冊監聽playerItem
的status
屬性,只要狀態值發生變化,就會調用-observeValueForKeyPath:ofObject:change:context:
方法。我們可以在該方法做一些操作:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (context == &playerItemContext) {
if ([keyPath isEqualToString:@"status"]) {
AVPlayerItemStatus status = [change[NSKeyValueChangeNewKey] integerValue];
switch (status) {
case AVPlayerItemStatusReadyToPlay:
//playerItem可以播放了。
break;
case AVPlayerItemStatusFailed:
//playerItem失敗了,查看error
break;
case AVPlayerItemStatusUnknown:
//playerItem還沒準備好
break;
default:
break;
}
}
}else{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
在該方法中獲取playerItem
的status
值,如果狀態值是AVPlayerItemStatusReadyToPlay
,那么可以播放了。如果在嘗試加載playerItem
的媒體時遇到問題,則狀態值為AVPlayerItemStatusFailed
。如果發生故障,可以通過查詢playerItem
的error
屬性來檢索失敗的詳細信息。
4.2、監測播放時間
觀察asset
的播放時間,以更新AVPlayer
的狀態。
通常觀察asset
的播放時間,以便更新進度條或以其他方式同步用戶界面的狀態。KVO 不適合觀察狀態持續變化;而AVPlayer
提供了兩種不同的方式來觀察播放時間變化:周期性觀察和邊界觀察。
4.2.1、周期性觀察
可以按一定的時間間隔觀察時間變化。如果使用自定義player
,則周期性觀察的最常見用例是更新用戶界面中的時間顯示。
使用AVPlayer
的-addPeriodicTimeObserverForInterval:queue:usingBlock:
方法觀察周期性時間變化;該方法接受一個表示時間間隔的CMTime
值、一個串行調度隊列和一個在指定時間間隔調用的回調塊。以下示例顯示如何設置在正常播放期間每半秒調用一次的塊:
id _timeObserverToken;
- (void)addPeriodicTimeObserver
{
// 每半秒通知一次
CMTime time = CMTimeMakeWithSeconds(0.5, NSEC_PER_SEC);
_timeObserverToken = [_player addPeriodicTimeObserverForInterval:time queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
//更新UI
}];
}
- (void)removePeriodicTimeObserver
{
if (_timeObserverToken) {
[_player removeTimeObserver:_timeObserverToken];
_timeObserverToken = nil;
}
}
4.2.2、觀察邊界時間
可以在媒體的時間軸中定義多個監測點,并且框架會在正常播放期間遍歷這些時間點并通知我們。邊界觀測的使用頻率低于周期性觀測,但在某些情況下仍然有用。例如,如果播放的視頻沒有一些播放控件(如開關),并且需要同步顯示或在遍歷那些時間時顯示播放控件,則可以使用邊界觀察。
使用AVPlayer
的-addBoundaryTimeObserverForTimes:queue:usingBlock:
方法觀察邊界時間。這個方法接受一個NSValue對象數組:包含定義邊界時間的CMTime值,一個串行調度隊列和一個回調塊。下面的例子展示了如何定義四分之一播放的邊界時間:
- (void)addBoundaryTimeObserver
{
//將asset的持續時間劃分為四分之一。
CMTime interval = CMTimeMultiplyByFloat64(_asset.duration, 0.25);
CMTime currentTime = kCMTimeZero;
NSMutableArray<NSValue *> *times = [NSMutableArray array];
CMTimeMinimum(currentTime, _asset.duration);
while (CMTimeCompare(currentTime, _asset.duration)) {
currentTime = CMTimeAdd(currentTime, interval);
[times addObject:[NSValue valueWithCMTime:currentTime]];
}
_timeObserverToken = [_player addBoundaryTimeObserverForTimes:times queue:dispatch_get_main_queue() usingBlock:^{
//更新UI
}];
}
4.3、查詢媒體
查詢或取消一個媒體項目,以快速訪問指定時間點。
除了正常的線性播放之外,用戶還希望能夠以非線性的方式查找或刪除內容,以便快速獲得媒體中各種感興趣的點。AVKit自動為你提供刪除控制(如果媒體支持),但如果正在構建一個自定義播放器,需要我們構建這個特性。即使在使用AVKit的情況下,仍然需要提供一個補充的用戶界面,例如表視圖或集合視圖,允許用戶快速跳到媒體中的各個位置。
4.3.1、快速跳轉到指定時間
可以使用AVPlayer
和AVPlayerItem
的方法以多種方式查找。最常見的方法是使用AVPlayer
的-seekToTime:
方法,將目標CMTime
值傳遞給它,如下所示:
//查詢2分鐘的標記
CMTime time = CMTimeMakeWithSeconds(120, 1);
[_player seekToTime:time];
-seekToTime:
方法更注重速度而不是精確度。這意味著AVPlayer
移動的實際時間可能與請求的時間不同。
4.3.2、準確跳轉到指定時間
使用-seekToTime:toleranceBefore:toleranceAfter:
方法實現精確的查找,該方法允許指定與目標時間(之前和之后)的容差偏差量;
//在3分25秒標記處尋找第一幀
CMTime seekTime = CMTimeMakeWithSeconds(205, NSEC_PER_SEC);
[_player seekToTime:seekTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
4.4、播放asset
創建音頻或視頻播放器以播放由playerItem
建模的asset
。
AVPlayer 繼承自NSObject
,提供界面以控制player
的傳輸行為。
AVQueuePlayer 繼承自AVPlayer
,按順序播放多個playerItem
。使用此類創建和管理由本地或逐步下載的基于文件的媒體(如QuickTime電影或MP3音頻文件)以及使用HTTP Live Streaming提供的媒體組成的playerItem
隊列。
AVPlayerLayer 繼承自CALayer
, 管理player
畫面輸出。
AVPlayerItem 繼承自NSObject
,用于建模player
所播放的asset
的時間和表示狀態。
AVPlayerItemTrack 繼承自NSObject
,用于修改由player
呈現的assetTrack
的呈現狀態。
AVSynchronizedLayer 繼承自NSObject
,用于與指定playerItem
同步。
AVPlayerItemMetadataCollector 繼承自AVPlayerItemMediaDataCollector
,用于捕獲為HTTP Live Streaming資產定義的日期范圍元數據。
AVPlayerMediaSelectionCriteria 繼承自NSObject
,指定player
的首選語言和媒體特性。player
在準備和播放playerItem
時應嘗試自動選擇這些選項。語言和媒體特性按優先順序指定。
AVSampleBufferAudioRenderer 繼承自NSObject
,用于解壓縮音頻,播放壓縮或未壓縮音頻。
AVSampleBufferDisplayLayer 繼承自CALayer
,顯示壓縮或未壓縮視頻幀。
AVSampleBufferRenderSynchronizer 繼承自NSObject
,將多個隊列中的樣本緩沖區同步到單個時間軸
4.5、播放QuickTime和ISO相關媒體的asset
AVMovie 繼承自AVAsset
,表示符合QuickTime或基于ISO媒體文件格式的視聽容器。
AVMovieTrack 繼承自AVAssetTrack
,符合QuickTime或基于ISO媒體文件格式的軌道。
AVFragmentedMovie 繼承自AVMovie
,用于處理片段影片文件。
AVFragmentedMovieTrack 繼承自AVMovieTrack
,用于處理片段化影片文件軌道。
AVFragmentedMovieMinder 繼承自AVFragmentedAssetMinder
,用于檢查是否已將其他影片片段追加到片段化影片文件中。
AVMediaDataStorage 繼承自NSObject
,用于創建示例數據文件。