前言
在近几年,国内视频版权慢慢得到了重视,各大视频平台也纷纷打起了内容资源争夺战。然而购买版权是需要成本的,这种额外的成本,如果只是单靠传统的广告收费模式来支撑的话,无疑是弥补不了这额外带来的成本消耗,所以在这同一时间,就出现了一种新的收费模式,也就是现在看到的,VIP特权收费模式。要实现这种模式,其最根本的问题,就是如何保护视频,杜绝非法下载。不同的平台都有自己的一套实现方案,而在这里就主要说一下,近日我所研究的优酷视频的实现方案。
面临的问题
要防止非法下载,所需要解决的核心问题有以下四个:
- 防止真实视频地址的暴露
- 防止视频泄漏
- 防止真实视频地址被猜测
- 防止播放器被分析
防止真实地址的暴露
在几年前,如果看到有喜欢的视频,就算平台没有提供下载按钮,想把视频下来也是十分容易的一件事情。最简单的做法,就是使用浏览器上的F12配套工具,查看下载资源的路径;又或者直接使用http代理的软件,来观察打开页面时的所有http请求。
而想要不被以上手段捕捉到,答案也非常明显,只要在下载视频文件的时候,避免使用http协议就好了。优酷的做法是把真实的下载链接,隐藏在http://k.youku.com/player/getFlvPath接口的背后,通过返回的json结果,来获得真实的下载连接,然后再使用tcp进行文件下载。
防止视频泄漏
每个视频在观看的时候,都必须会经过下载这个过程,而有下载就会有它所存放的链接路径,尤其会员专属的视频,为了提高吸引力,一般都会提供限时的免费试看,一旦有试看,就会有对应的下载链接。就算是使用tcp进行下载,也很难避免下载地址不被其他抓包工具发现,而一旦地址暴露后,如何去降低链接暴露后视频泄漏程度呢?一般来说,有三种方法:
- 视频加密
- 区分试看片源与正片源
- 视频切片
这三种方法里面,优酷使用的是第三种,视频切片。而第一,二种为什么不使用,原因是这两种方法都会带来一些负面的影响。首先来说说视频加密,要实现视频加密,所要面临的问题有两个,一个是视频加密时所带来的维护工作量,第二个是在解密过程中,有一定程度上影响了视频解码速率。而第二个方法,如果收费的视频,都区分正片跟试看片,无疑在硬盘空间使用量上,将会有一定程度的消耗。而第三种方法,则是在这三种方法里面,负面影响最少,同时可行性也是比较高的一种方案。
所谓的视频切片,就是通过固定的时间,对视频进行切割,每一段都分开加载,当上一段观看快结束的时候,才开始加载下一段。这样做的好处是,试看的时候,服务器只需要提供第一分片的视频地址,而后续的分片则在试看过程中不会再请求,从而避免了视频泄露的问题,既达到了第二种方法的效果,同时也不会有太大的硬盘空间消耗。
防止视频地址被猜测
为了弱化业务的逻辑复杂度,一般的文件服务器,都是无状态的,很少会去校验请求的用户是否具有权限,所以在文件下载地址上,需要一定程度上地避免被猜测的可能。
以上面的切片例子为例,假如第一分片的地址,被用户知道了,如果单单通过修改一个分片ID,就可以下载不同的分片的话,那么这个切片的处理就完全没有意义的。所以优酷在每个分片上都会单独生成一个security code, 而在获取下载链接地址的时候,则需要通过security code参与特定算法生成访问路径,从而降低视频地址被猜测的可能性。
防止播放器被分析
要保证算法的保密性,就必须要做到算法不被分析。现在的网页播放器大多是使用Flash来做,而运行在Flash VM上代码,基本上都可以说是透明的,所以优酷在核心的加密解密算法上,使用了Alchemy技术,把关键代码都转到了LLVM上,从而在一定程度上,保证了算法的保密性
总结
以上内容,就是近日我在分析优酷播放器时的一些心得和总结,在最后说到的Alchemy技术,不只是视频,其实很多行业都可以用的上,比如说Flash页游客户端,或者使用了Adobe AIR的手游,都可以使用这技术尽最大可能性地保障客户端的保密性。
有兴趣的朋友可以在以下地址下载相关代码:
http://code.taobao.org/svn/youkuplay