使用AVPlayer播放内存中的NSData

问题描述:

使用AVPlayer播放内存中的NSData_第1张图片

假设我们已经把上图的目录结构缓存到手机的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

你可能感兴趣的:(使用AVPlayer播放内存中的NSData)