AVFoundation編程指南11-AVAsset緩存和下載

寫在前面

喜歡AVFoundation資料的同學(xué)可以關(guān)注我的專題:《AVFoundation》專輯
也可以關(guān)注我的簡(jiǎn)書賬號(hào)

正文

本文所述結(jié)構(gòu)圖如下:

結(jié)構(gòu)圖

AVAsset緩存

AVAsset緩存需要AVAssetCache類來實(shí)現(xiàn)。

@property (nonatomic, readonly, getter=isPlayableOffline) BOOL playableOffline;
屬性名稱 playableOffline
解釋 如果可以在沒有網(wǎng)絡(luò)連接的情況下播放AVAsset的完整再現(xiàn),則返回YES。
備注 YES的答案并不表示任何給定的媒體選擇可用于離線播放。要確定特定媒體選擇是否可脫機(jī)使用,請(qǐng)參閱mediaSelectionOptionsInMediaSelectionGroup:。
- (NSArray<AVMediaSelectionOption *> *)mediaSelectionOptionsInMediaSelectionGroup:(AVMediaSelectionGroup *)mediaSelectionGroup;

返回AVMediaSelectionGroup中可用于脫機(jī)操作的AVMediaSelectionOptions數(shù)組,例如playback。

AVAssetDownloadStorageManager

AVAssetDownloadStorageManager管理自動(dòng)清除下載的AVAssets的策略。該策略作為AVAssetDownloadStorageManagementPolicy對(duì)象提供。

需要在asset上設(shè)置management策略時(shí),需要獲取sharedDownloadStorageManager單例。然后,可以使用setStorageManagementPolicy和下載asset的位置來設(shè)置新的策略。

typedef NSString *AVAssetDownloadedAssetEvictionPriority NS_STRING_ENUM API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, tvos, watchos);

AVAssetDownloadedAssetEvictionPriority字符串常量,由AVAssetDownloadStorageManagementPolicy使用。

AVF_EXPORT AVAssetDownloadedAssetEvictionPriority const AVAssetDownloadedAssetEvictionPriorityImportant             API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, tvos, watchos);
AVF_EXPORT AVAssetDownloadedAssetEvictionPriority const AVAssetDownloadedAssetEvictionPriorityDefault               API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, tvos, watchos);
枚舉名稱 AVAssetDownloadedAssetEvictionPriority
解釋 這些常量表示下載asset的優(yōu)先級(jí)。

AVAssetDownloadedAssetEvictionPriorityImportant
用于標(biāo)記具有最高優(yōu)先級(jí)的asset。它們將會(huì)最后被清理。

AVAssetDownloadedAssetEvictionPriorityDefault
用于標(biāo)記asset具有默認(rèn)優(yōu)先級(jí)。它們將會(huì)最先被清理。

AVAssetDownloadStorageManager

+ (AVAssetDownloadStorageManager *)sharedDownloadStorageManager;

該函數(shù)會(huì)返回一個(gè)單例。

- (void)setStorageManagementPolicy:(AVAssetDownloadStorageManagementPolicy *)storageManagementPolicy forURL:(NSURL *)downloadStorageURL;
函數(shù)名稱 setStorageManagementPolicy: forURL
解釋 downloadStorageURL中設(shè)置具有磁盤備份的asset的策略。
參數(shù) downloadStorageURL:
下載asset的位置。
- (nullable AVAssetDownloadStorageManagementPolicy *)storageManagementPolicyForURL:(NSURL *)downloadStorageURL;
函數(shù)名 storageManagementPolicyForURL:downloadStorageURL
解釋 返回downloadStorageURL下載的asset的存儲(chǔ)管理策略。如果從未在下載的asset上設(shè)置storageManagementPolicy,則此值可能為nil。
參數(shù) downloadStorageURL:
下載asset的位置。

AVAssetDownloadStorageManagementPolicy

@property (nonatomic, readonly, copy) AVAssetDownloadedAssetEvictionPriority priority;
屬性名 priority
解釋 表示下載asseteviction優(yōu)先級(jí)。
備注 具有默認(rèn)優(yōu)先級(jí)的asset將首先在具有較高優(yōu)先級(jí)的asset之前清除。
如果未設(shè)置,則使用默認(rèn)優(yōu)先級(jí)。
@property (nonatomic, readonly, copy) NSDate *expirationDate;

返回asset的過期時(shí)間。

AVMutableAssetDownloadStorageManagementPolicy

@property (nonatomic, copy) AVAssetDownloadedAssetEvictionPriority priority;
屬性名稱 priority
解釋 表示下載assetpriority優(yōu)先級(jí)。
備注 具有默認(rèn)優(yōu)先級(jí)的asset將首先在具有較高優(yōu)先級(jí)的asset之前清除。
如果未設(shè)置,則使用默認(rèn)優(yōu)先級(jí)。
@property (nonatomic, copy) NSDate *expirationDate;

返回asset的過期時(shí)間。

AVAssetDownloadTask

AVAssetDownloadTask是一個(gè)NSURLSessionTask,接受遠(yuǎn)程AVURLAssets在本地下載。

應(yīng)使用- [AVAssetDownloadURLSession assetDownloadTaskWithURLAsset:assetTitle:assetArtworkData:options:]創(chuàng)建。要利用本地?cái)?shù)據(jù)回放正在進(jìn)行的下載,請(qǐng)重新使用初始化中提供的URLAsset。 AVAssetDownloadTask可以使用指向磁盤上現(xiàn)有assetdestinationURL進(jìn)行實(shí)例化,以完成或擴(kuò)充下載的asset。

AVF_EXPORT NSString *const AVAssetDownloadTaskMinimumRequiredMediaBitrateKey API_AVAILABLE(ios(9.0)) API_UNAVAILABLE(macos, tvos, watchos);
key名稱 AVAssetDownloadTaskMinimumRequiredMediaBitrateKey
解釋 將選擇大于或等于此值的最低媒體比特率。值應(yīng)為bps中的NSNumber。如果未找到合適的媒體比特率,則將選擇最高媒體比特率。
此鍵的值應(yīng)為NSNumber。
備注 默認(rèn)情況下,將選擇最高媒體比特率進(jìn)行下載。
AVF_EXPORT NSString *const AVAssetDownloadTaskMediaSelectionKey API_AVAILABLE(ios(9.0)) API_UNAVAILABLE(macos, tvos, watchos);
Key名稱 AVAssetDownloadTaskMediaSelectionKey
解釋 此下載的媒體選擇。
這個(gè)Key的值應(yīng)是AVMediaSelection。
備注 默認(rèn)情況下,將自動(dòng)選擇AVAssetDownloadTask的媒體選擇。

AVAssetDownloadTask

@property (nonatomic, readonly) AVURLAsset *URLAsset;

初始化時(shí)提供給下載任務(wù)的asset。

@property (nonatomic, readonly) NSURL *destinationURL NS_DEPRECATED_IOS(9_0, 10_0);

初始化時(shí)提供給下載任務(wù)的文件URL

URL可能已附加了asset的相應(yīng)擴(kuò)展名。

@property (nonatomic, readonly, nullable) NSDictionary<NSString *, id> *options;

初始化時(shí)提供給下載任務(wù)的選項(xiàng)。

@property (nonatomic, readonly) NSArray<NSValue *> *loadedTimeRanges;

此屬性提供下載任務(wù)已下載并可播放的媒體數(shù)據(jù)的時(shí)間范圍集合。提供的范圍可能是不連續(xù)的。

返回包含CMTimeRangesNSValuesNSArray。

@property (readonly, copy) NSURLRequest *originalRequest NS_UNAVAILABLE;
@property (readonly, copy) NSURLRequest *currentRequest NS_UNAVAILABLE;
@property (readonly, copy) NSURLResponse *response NS_UNAVAILABLE;

NSURLRequestNSURLResponse對(duì)象不適用于AVAssetDownloadTask。

AVAggregateAssetDownloadTask

@property (nonatomic, readonly) AVURLAsset *URLAsset;

初始化時(shí)提供給下載任務(wù)的asset。

@property (readonly, copy) NSURLRequest *originalRequest NS_UNAVAILABLE;
@property (readonly, copy) NSURLRequest *currentRequest NS_UNAVAILABLE;
@property (readonly, copy) NSURLResponse *response NS_UNAVAILABLE;

NSURLRequestNSURLResponse對(duì)象不適用于AVAggregateAssetDownloadTask。

AVAssetDownloadDelegate代理方法

- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didFinishDownloadingToURL:(NSURL *)location NS_AVAILABLE_IOS(10_0);
函數(shù)名稱 URLSession:assetDownloadTask:didFinishDownloadingToURL:
解釋 已完成下載的下載任務(wù)時(shí)發(fā)送。
參數(shù) session:
asset下載任務(wù)所在的會(huì)話。

assetDownloadTask:
已下載完成的AVAssetDownloadTask。

location:
asset已下載到的位置。
備注 NSURLSessionDownloadDelegate不同,委托在調(diào)用文件后不應(yīng)該從該目錄移動(dòng)該文件。下載的asset必須保留在系統(tǒng)提供的URL中。 URLSession:task:didCompleteWithError:仍將被調(diào)用。
- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didLoadTimeRange:(CMTimeRange)timeRange totalTimeRangesLoaded:(NSArray<NSValue *> *)loadedTimeRanges timeRangeExpectedToLoad:(CMTimeRange)timeRangeExpectedToLoad NS_AVAILABLE_IOS(9_0);
函數(shù)名稱 URLSession:assetDownloadTask:didLoadTimeRange:totalTimeRangesLoaded:timeRangeExpectedToLoad:
解釋 用于訂閱AVAssetDownloadTask的進(jìn)度更新的方法。
參數(shù) session:
asset下載任務(wù)所在的會(huì)話。

assetDownloadTask:
正在更新的AVAssetDownloadTask

timeRange:
一個(gè)CMTimeRange,指示自上次調(diào)用此方法以來加載的時(shí)間范圍。

loadedTimeRanges:
CMTimeRangesNSValuesNSArray,指示此asset下載任務(wù)加載的所有時(shí)間范圍。

timeRangeExpectedToLoadz:
CMTimeRange,指示下載完成時(shí)預(yù)期要加載的單個(gè)時(shí)間范圍。
- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didResolveMediaSelection:(AVMediaSelection *)resolvedMediaSelection NS_AVAILABLE_IOS(9_0);
函數(shù)名稱 URLSession:assetDownloadTask:didResolveMediaSelection:
解釋 完全解析下載媒體選擇時(shí)調(diào)用的方法,包括任何自動(dòng)的選擇。
參數(shù) session:
asset下載任務(wù)所在的會(huì)話。

assetDownloadTask
正在更新的AVAssetDownloadTask。

resolvedMediaSelection:
已下載任務(wù)的已解析媒體選擇。為了在沒有進(jìn)一步網(wǎng)絡(luò)I/O的情況下播放下載內(nèi)容的最佳機(jī)會(huì),請(qǐng)將此選擇應(yīng)用于后續(xù)AVPlayerItem。
- (void)URLSession:(NSURLSession *)session aggregateAssetDownloadTask:(AVAggregateAssetDownloadTask *)aggregateAssetDownloadTask willDownloadToURL:(NSURL *)location NS_AVAILABLE_IOS(11_0);
函數(shù)名稱 URLSession:aggregateAssetDownloadTask:willDownloadToURL:
解釋 聚合下載任務(wù)確定此asset將下載到的位置時(shí)調(diào)用的方法。
參數(shù) session:
聚合asset下載任務(wù)所在的會(huì)話。

aggregateAssetDownloadTask:
AVAggregateAssetDownloadTask。

location:
此任務(wù)將文件URL下載到的文件URL。
備注 應(yīng)保存此URL以用于AVAsset的未來實(shí)例化。雖然此內(nèi)容已存在AVAsset,但建議重新使用該實(shí)例。
- (void)URLSession:(NSURLSession *)session aggregateAssetDownloadTask:(AVAggregateAssetDownloadTask *)aggregateAssetDownloadTask didCompleteForMediaSelection:(AVMediaSelection *)mediaSelection NS_AVAILABLE_IOS(11_0);
函數(shù)名稱 URLSession:aggregateAssetDownloadTask:didCompleteForMediaSelection:
解釋 AVAssetDownloadTask子類完成時(shí)調(diào)用的方法。
參數(shù) session:
聚合asset下載任務(wù)所在的會(huì)話。

aggregateAssetDownloadTask:
AVAggregateAssetDownloadTask。

mediaSelection:
AVMediaSelection現(xiàn)在完全可供離線使用。
- (void)URLSession:(NSURLSession *)session aggregateAssetDownloadTask:(AVAggregateAssetDownloadTask *)aggregateAssetDownloadTask didLoadTimeRange:(CMTimeRange)timeRange totalTimeRangesLoaded:(NSArray<NSValue *> *)loadedTimeRanges timeRangeExpectedToLoad:(CMTimeRange)timeRangeExpectedToLoad forMediaSelection:(AVMediaSelection *)mediaSelection NS_AVAILABLE_IOS(11_0);
函數(shù)名稱 URLSession:aggregateAssetDownloadTask:didLoadTimeRange:totalTimeRangesLoaded:timeRangeExpectedToLoad:forMediaSelection:
解釋 用于訂閱AVAggregateAssetDownloadTask的進(jìn)度更新的方法
參數(shù) session:
asset下載任務(wù)所在的會(huì)話。

aggregateAssetDownloadTask:
AVAggregateAssetDownloadTask。

timeRange:
CMTimeRange,指示為下載的媒體選擇加載的時(shí)間范圍。

loadedTimeRanges:
CMTimeRangesNSValuesNSArray,指示為下載的媒體選擇加載的所有時(shí)間范圍。

timeRangeExpectedToLoad:
CMTimeRange,指示在下載完媒體選擇的下載時(shí)預(yù)期要加載的單個(gè)時(shí)間范圍。

mediaSelection:
媒體選擇,其中包含用于離線使用的其他媒體數(shù)據(jù)。

AVAssetDownloadURLSession

+ (AVAssetDownloadURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration assetDownloadDelegate:(nullable id <AVAssetDownloadDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)delegateQueue;
函數(shù)名稱 sessionWithConfiguration:assetDownloadDelegate:delegateQueue:
解釋 創(chuàng)建并初始化AVAssetDownloadURLSession以與AVAssetDownloadTasks一起使用。
參數(shù) configuration:
URLSession的配置。必須是后臺(tái)配置。

assetDownloadDelegate:
委托對(duì)象,用于處理asset下載進(jìn)度更新和其他與會(huì)話相關(guān)的事件。

delegateQueue:
接收委托回調(diào)的隊(duì)列。如果為nil,則將提供串行隊(duì)列。
- (nullable AVAssetDownloadTask *)assetDownloadTaskWithURLAsset:(AVURLAsset *)URLAsset destinationURL:(NSURL *)destinationURL options:(nullable NSDictionary<NSString *, id> *)options NS_DEPRECATED_IOS(9_0, 10_0);
函數(shù)名稱 assetDownloadTaskWithURLAsset:destinationURL:options:
解釋 創(chuàng)建并初始化要與此AVAssetDownloadURLSession一起使用的AVAssetDownloadTask。
參數(shù) URLAsset:
AVURLAsset可在本地下載。

destinationURL:
要將asset下載到的本地URL。這必須是文件URL

options:
請(qǐng)參閱上面的AVAssetDownloadTask * Key。配置下載任務(wù)的非默認(rèn)行為。下載HLS asset的非默認(rèn)媒體選擇時(shí)需要使用此參數(shù)。
備注 如果URLSession已失效,則此方法可能返回nil。
- (nullable AVAssetDownloadTask *)assetDownloadTaskWithURLAsset:(AVURLAsset *)URLAsset assetTitle:(NSString *)title assetArtworkData:(nullable NSData *)artworkData options:(nullable NSDictionary<NSString *, id> *)options NS_AVAILABLE_IOS(10_0);
函數(shù)名稱 assetDownloadTaskWithURLAsset:assetTitle:assetArtworkData:options:
解釋 創(chuàng)建并初始化要與此AVAssetDownloadURLSession一起使用的AVAssetDownloadTask。
參數(shù) URLAsset:
AVURLAsset可在本地下載。

assetTitle:
assethuman readable title,應(yīng)盡可能適合用戶的首選語言。將顯示在設(shè)置應(yīng)用的使用情況窗格中。

assetArtworkData:
NSData表示此asset的圖稿數(shù)據(jù)。是可選的。將顯示在設(shè)置應(yīng)用的使用情況窗格中。必須使用+ [UIImage imageWithData:]。

options:
請(qǐng)參閱上面的AVAssetDownloadTask * Key。配置下載任務(wù)的非默認(rèn)行為。下載HLS``asset的非默認(rèn)媒體選擇時(shí)需要使用此參數(shù)。
備注 如果URLSession已失效,則此方法可能返回ni
- (nullable AVAggregateAssetDownloadTask *)aggregateAssetDownloadTaskWithURLAsset:(AVURLAsset *)URLAsset mediaSelections:(NSArray <AVMediaSelection *> *)mediaSelections assetTitle:(NSString *)title assetArtworkData:(nullable NSData *)artworkData options:(nullable NSDictionary<NSString *, id> *)options NS_AVAILABLE_IOS(11_0);
函數(shù)名稱 aggregateAssetDownloadTaskWithURLAsset:mediaSelections:assetTitle:assetArtworkData:options:
解釋 創(chuàng)建并初始化AVAggregateAssetDownloadTask以在AVURLAsset上下載多個(gè)AVMediaSelections。
參數(shù) URLAsset:
AVURLAsset可在本地下載。

mediaSelections:
AVMediaSelections列表。每個(gè)AVMediaSelection將對(duì)應(yīng)一個(gè)childAssetDownloadTask。使用- [AVAsset allMediaSelections]下載此AVAsset上的所有AVMediaSelections。

assetTitle:
asset的人類可讀標(biāo)題,應(yīng)盡可能適合用戶的首選語言。將顯示在設(shè)置應(yīng)用的使用情況窗格中。

assetArtworkData:
asset的圖稿數(shù)據(jù)。是可選的。將顯示在設(shè)置應(yīng)用的使用情況窗格中。

options:
請(qǐng)參閱上面的AVAssetDownloadTask * Key。配置下載任務(wù)的非默認(rèn)行為。
備注 如果URLSession已失效,則此方法可能返回nil。 AVAssetDownloadTaskMediaSelectionKey的值將被忽略。

只能使用AVAssetDownloadURLSession創(chuàng)建AVAssetDownloadTasks

+ (NSURLSession *)sharedSession NS_UNAVAILABLE;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration NS_UNAVAILABLE;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue NS_UNAVAILABLE;
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request NS_UNAVAILABLE;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url NS_UNAVAILABLE;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL NS_UNAVAILABLE;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData NS_UNAVAILABLE;
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request NS_UNAVAILABLE;
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request NS_UNAVAILABLE;
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url NS_UNAVAILABLE;
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData NS_UNAVAILABLE;
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(nullable NSData *)bodyData completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler NS_UNAVAILABLE;
上一章 目錄 下一章
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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