Android 播放加密视频的一个思路

基本思路

Android 播放加密视频的基本思路就是:本地启动一个HTTP服务作为代理,解密之后给播放器播放
这样的好处就是可以自定义加密方案,更重要的是 加密/解密模块 可以和视频播放模块解耦

处理HTTP头

这里使用的 NanoHTTPD , 一个纯Java实现的微型WEB服务器,代码开源。
代码实现起来很简单,只要继承然后重写两个方法就可以。
稍微复杂的是怎样处理从视频播放器过来的请求。

通过 Charles 代理就能发现简单的规律。
VideoView播放在线视频的时候,发出的GET请求。第一次是一个普通的请求,务器返回200;之后的则全是分段请求,服务器返回206。

第一次请求 和 结果


第二次请求 和 结果

两次Request的区别是 后面的有Range字段
两次Response的区别是:

  1. 第一次 返回HTTP200 第二次 返回HTTP206
  2. 第一次 Content-Length是文件的整体大小; 第二次Content-Lenght是剩余的大小
  3. 第二次 返回Content-Range

有了区别之后就简单了,剩下要做的就是: 根据Req的不同,返回不同的 HTTP头 和数据

继承InputStream

Demo中用到的”加密”很简单: 直接在文件头部加入一些16进制的文字,一般的视频播放就没法识别了。
当然还可以有其他拓展的加密方法,比如数据乱序存储(在文件头部存储读取索引)、数据按块大小进行加密等

Demo中直接继承InputStream, 然后重写几个必要的方法,通过InputStream.Skip()方法跳过无用的文件头即可。

Demo

源码见:Github Repo

目录

  1. 1. 基本思路
  2. 2. 处理HTTP头
  3. 3. 继承InputStream
  4. 4. Demo