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头 和数据

Read More

RxJava 批量计算网络连接速度

1.计算连接耗时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static long calcConnCost(String url) {
long start = new Date().getTime();
long end = start;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestProperty("Range", "bytes=0-0");
conn.setIfModifiedSince(1);
start = new Date().getTime();
if (conn.getResponseCode() == 206 || conn.getResponseCode() == 200) {
end = new Date().getTime();
}
conn.disconnect();
conn = null;
} catch (IOException e) {
e.printStackTrace();
}
return end - start;
}

2.异步计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        Observable.just("http://baidu.com")
.map(new Func1<String, Long>() {
@Override
public Long call(String url) {
return calcConnCost(url);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long cost) {
Log.d("time", cost + "");
}
});
//输出 time:90

Read More