使用AVPlayer播放内存中的NSData

作者: 么鬼 | 来源:发表于2016-07-20 14:33 被阅读1945次

    问题描述:

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

        本文链接:https://www.haomeiwen.com/subject/peyvjttx.html