問題描述:
假設(shè)我們已經(jīng)把上圖的目錄結(jié)構(gòu)緩存到手機(jī)的Document目錄下,每個(gè)ts文件都是加密文件况增,加密算法都不是標(biāo)準(zhǔn)的AES-128-CBC赞庶,這里我們使用AES-128-ECB的加密模式。現(xiàn)在要播放這個(gè)緩存目錄澳骤,并且要求解密的ts文件不可以生成歧强,以防被別人盜用。
首先大家要明確幾點(diǎn):
1.蘋果的AVPlayer是只能基于路徑播放的为肮,不能直接播放NSData摊册。
2.蘋果HLS協(xié)議的加密算法只支持AES-128-CBC,也就是說如果使用了其它的加密算法加密切片文件颊艳,AVPlayer是無法播放視頻的
3.請(qǐng)求鏈接的Scheme為http或https時(shí)茅特,AVAssetResourceLoader的代理不會(huì)響應(yīng)。
我的實(shí)現(xiàn)步驟:
基于上方“蘋果的AVPlayer是只能基于路徑播放的棋枕,不能直接播放NSData”的共識(shí)白修,而且又不能生成解密的文件保存到本地。
那么我唯一能想到的辦法就是將解密的數(shù)據(jù)流偽裝成一個(gè)Http請(qǐng)求路徑戒悠,這就需要在手機(jī)內(nèi)構(gòu)件一個(gè)HttpServer的服務(wù)熬荆,發(fā)起一個(gè)本地的http請(qǐng)求,將解密后的數(shù)據(jù)返回給AVPlayer。
這里用到的CocoaHttpServer卤恳,封裝一個(gè)類似URL的請(qǐng)求傳給AVAsset
cplp://127.0.0.1:12345/outRun.m3u8
注意scheme不能是http或者h(yuǎn)ttps累盗,否則AVAssetResourceLoaderDelegate是不會(huì)觸發(fā)下面的代理
- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
在代理函數(shù)中對(duì)不同的url scheme進(jìn)行相應(yīng)的處理,將cplp替換成http
其中針對(duì)ts的解密處理在CocoaHttpServer中進(jìn)行:
- (NSObject*)httpResponseForMethod:(NSString *)method URI:(NSString *)path
后續(xù):
后續(xù)會(huì)添加網(wǎng)絡(luò)相關(guān)的處理突琳,如何緩存需求的目錄的若债。
Demo:
我在GitHub上上傳了個(gè)demo:GitDemo
有興趣的同學(xué)可以看下,如果對(duì)你有幫助請(qǐng)star