Android 播放加密视频的一个思路
date
‣
slug
Android-Play-Encrypted-Video
status
Published
tags
Android
summary
基本思路Android 播放加密视频的基本思路就是:本地启动一个HTTP服务作为代理,解密之后给播放器播放。这样的好处就是可以自定义加密方案,更重要的是 加密/解密模块 可以和视频播放模块解耦。
处理HTTP头这里使用的 NanoHTTPD , 一个纯Java实现的微型WEB服务器,代...
type
Post
基本思路
Android 播放加密视频的基本思路就是:本地启动一个HTTP服务作为代理,解密之后给播放器播放。
这样的好处就是可以自定义加密方案,更重要的是 加密/解密模块 可以和视频播放模块解耦。
处理HTTP头
这里使用的 NanoHTTPD , 一个纯Java实现的微型WEB服务器,代码开源。
代码实现起来很简单,只要继承然后重写两个方法就可以。
稍微复杂的是怎样处理从视频播放器过来的请求。
通过 Charles 代理就能发现简单的规律。
VideoView播放在线视频的时候,发出的GET请求。第一次是一个普通的请求,务器返回200;之后的则全是分段请求,服务器返回206。
第一次请求 和 结果
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F74874109-3f4a-47e8-bd21-d244a829d694%2F6a5cbec2-91d2-497a-9ed8-349f496de047%2FUntitled.png?table=block&id=1bc0bb48-caf9-42fb-89b5-12531c438f6c&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F74874109-3f4a-47e8-bd21-d244a829d694%2F42716924-0339-4bb9-9f5f-e35a3d67ad92%2FUntitled.png?table=block&id=26c0b6aa-5b71-4f2d-a7a2-f0fc38c6994d&cache=v2)
第二次请求 和 结果
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F74874109-3f4a-47e8-bd21-d244a829d694%2F2474e214-0da9-4702-990c-9ac6c3779534%2FUntitled.png?table=block&id=2ad183ab-c733-4dba-9f32-0e4b24ea0af7&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F74874109-3f4a-47e8-bd21-d244a829d694%2F556efbe9-ac1c-40e7-9b74-99cb093109a7%2FUntitled.png?table=block&id=1c863077-c68f-466f-a0f8-bf0040f36218&cache=v2)
两次Request的区别是 后面的有Range字段
两次Response的区别是:
- 第一次 返回HTTP200 第二次 返回HTTP206
- 第一次 Content-Length是文件的整体大小; 第二次Content-Lenght是剩余的大小
- 第二次 返回Content-Range
有了区别之后就简单了,剩下要做的就是: 根据Req的不同,返回不同的 HTTP头 和数据。
继承InputStream
Demo中用到的”加密”很简单: 直接在文件头部加入一些16进制的文字,一般的视频播放就没法识别了。
当然还可以有其他拓展的加密方法,比如数据乱序存储(在文件头部存储读取索引)、数据按块大小进行加密等
Demo中直接继承InputStream, 然后重写几个必要的方法,通过InputStream.Skip()方法跳过无用的文件头即可。
Demo
源码见:Github Repo
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F74874109-3f4a-47e8-bd21-d244a829d694%2F19c6d3dc-677c-469e-9a99-2d67395b5f35%2FUntitled.png?table=block&id=2c019ca3-670f-4946-bc92-a9a5906094b2&cache=v2)