问题描述:
假设我们已经把上图的目录结构缓存到手机的Document目录下,每个ts文件都是加密文件,加密算法都不是标准的AES-128-CBC,这里我们使用AES-128-ECB的加密模式。现在要播放这个缓存目录,并且要求解密的ts文件不可以生成,以防被别人盗用。
首先大家要明确几点:
1.苹果的AVPlayer是只能基于路径播放的,不能直接播放NSData。
2.苹果HLS协议的加密算法只支持AES-128-CBC,也就是说如果使用了其它的加密算法加密切片文件,AVPlayer是无法播放视频的
3.请求链接的Scheme为http或https时,AVAssetResourceLoader的代理不会响应。
我的实现步骤:
基于上方“苹果的AVPlayer是只能基于路径播放的,不能直接播放NSData”的共识,而且又不能生成解密的文件保存到本地。
那么我唯一能想到的办法就是将解密的数据流伪装成一个Http请求路径,这就需要在手机内构件一个HttpServer的服务,发起一个本地的http请求,将解密后的数据返回给AVPlayer。
这里用到的CocoaHttpServer,封装一个类似URL的请求传给AVAsset
cplp://127.0.0.1:12345/outRun.m3u8
注意scheme不能是http或者https,否则AVAssetResourceLoaderDelegate是不会触发下面的代理
- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
在代理函数中对不同的url scheme进行相应的处理,将cplp替换成http
其中针对ts的解密处理在CocoaHttpServer中进行:
- (NSObject*)httpResponseForMethod:(NSString *)method URI:(NSString *)path
后续:
后续会添加网络相关的处理,如何缓存需求的目录的。
Demo:
我在GitHub上上传了个demo:GitDemo
有兴趣的同学可以看下,如果对你有帮助请star