app的上播放的视频文件是经过加密处理的,在客户端通过修改FFMPEG源码,结合IJK播放器源码定义了自己的播放器,但是在网站上播放一直没有得到解决。后来找到了一个不错的类库:SparrowPlayer,该播放器使用AS3编写,根据描述其功能强大,而且容易上手,对于我这个对flash一点都不懂的人来说应该非常合适,因为我只想看看怎么更改其中的加密算法。
SparrowPlayer 论坛地址:http://bbs.9ria.com/thread-432553-1-1.html
从github使用git clone代码,使用flash builder 4.7打开会报错。是因为:
mx.core.MovieClipLoaderAsset;
这个类没有找到。可以参考地址:
https://killerspaz.wordpress.com/2011/10/12/using-mx-components-on-flexair-mobile
在库路径下添加:图中的路径文件core.swc
。
并且在源路径下添加。 Flashbuilder目录下面 \frameworks\projects\mx\src 文件夹,就可以了。播放加密的文件需要两个类库SparrowPlayer_BGWorker
,SparrowPlayer_SeekWorker
。需要先编译这两个部分的源码生成相应的swc文件,然后在将这两个文件放在。SparrowPlayer的src目录里面的m/media/httpe文件夹下。通过修改这两个类库的解密部分然后重新编译SparrowPlayer就可以实现自定义的加密格式了。但是最新的代码 commit id 为 23768516ce69bdf95ca63dab820f247137df2633
的在重新编译播放器后,无法播放加密视频,经过不断尝试在 commit id为8e7f33735e741b96887b66b31a394bb43e50211d
的提交时可以通过修改加密代码播放自定义加密视频.
修改SparrowPlayer_BGWorker.as
修改SparrowPlayer_SeekWorker.as文件
这里是对字节做了异或处理。seed是SparrowPlayer的Config.xml 传递进来了,这是一个配置文件,里面包含了很多flash播放器右键选择菜单信息。更改完加密方式后就可以可以选择 项目
->导出发行版
分别导出SparrowPlayer_BGWorker.swf和SparrowPlayer_SeekWorker.swc文件,然后将这两个文件放在SparrowPlayer目录下的位置。
然后在Sparrow工程中依旧选择项目
->导出发行版
,得到3个文件
然后将这三个文件放在ORG/demo/httpe目录下。
打开里面的html文件。然后设置httpe里面的地址为自己服务器上的加密视频文件所在路径。
注意assets的目录结构所处的位置,如果不在对应位置需要手动移动。config.xml里面包含了播放器界面上常用的信息,最下面的两个是加密相关的,第一个是从哪个字节开始加密的,第二个是
加密算法
flv视频的格式可以使用flvparse工具查看如下图所示
flv视频格式解析参考:
http://blog.sina.com.cn/s/blog_48f93b530100eyoe.html
这里加密的数据代码:
$file = 'xt_test.flv';
$encrypt_str = '';
$fileHandle = fopen($file,'r+');
//flv视频的header部分,前三个表示FLV这三个字母,第4个为版本号,后面9个固定长度表示头部的大小
$encrypt_str .= $header = fread($fileHandle, 13);
//取tag的类型,音频,视频或者script data
$encrypt_str .= fread($fileHandle,1);
//tag data部分的大小
$length = fread($fileHandle,3);
$encrypt_str .= $length;
//前三个表示时间戳,第四个用来在在前三个不够用时,有24位变成32位长度,后面三个是scream id固定为0
$encrypt_str .= fread($fileHandle,7);
$real_length = hexdec(bin2hex($length));
$encrypt_str .= fread($fileHandle,$real_length);//根据tag data的长度读取tag data。
// -- 剩下的加密
$encrypt_idx = 13+11+$real_length;//已经读取的文件大小,剩余的加密 386
$wait_encrypt = fread($fileHandle, filesize($file) - $encrypt_idx);
for ($i = 0;$i< strlen($wait_encrypt); $i++) {
$encrypt_str .= decbin(bindec(bin2hex($wait_encrypt[$i]) ^ 101));
}
file_put_contents('xt_encrypt.flv',$encrypt_str);
播放效果:
如果播放不成功可以根据控制台提示的信息进行操作,比如提示没有crossdomain.xml 文件。需要将该文件放在视频所处的根目录下。
crossdomain.xml文件在工程中是存在的如下图,直接移动过去就行