记录一次Flash播放加密视频实现

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

记录一次Flash播放加密视频实现_第1张图片
image.png

并且在源路径下添加。 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

记录一次Flash播放加密视频实现_第2张图片
image.png

修改SparrowPlayer_SeekWorker.as文件

记录一次Flash播放加密视频实现_第3张图片
image.png

这里是对字节做了异或处理。seed是SparrowPlayer的Config.xml 传递进来了,这是一个配置文件,里面包含了很多flash播放器右键选择菜单信息。更改完加密方式后就可以可以选择 项目->导出发行版分别导出SparrowPlayer_BGWorker.swf和SparrowPlayer_SeekWorker.swc文件,然后将这两个文件放在SparrowPlayer目录下的位置。

记录一次Flash播放加密视频实现_第4张图片
image.png

然后在Sparrow工程中依旧选择项目->导出发行版,得到3个文件

image.png

然后将这三个文件放在 ORG/demo/httpe目录下。

记录一次Flash播放加密视频实现_第5张图片
image.png

打开里面的html文件。然后设置httpe里面的地址为自己服务器上的加密视频文件所在路径。


记录一次Flash播放加密视频实现_第6张图片
image.png

注意assets的目录结构所处的位置,如果不在对应位置需要手动移动。config.xml里面包含了播放器界面上常用的信息,最下面的两个是加密相关的,第一个是从哪个字节开始加密的,第二个是

记录一次Flash播放加密视频实现_第7张图片
image.png

加密算法

flv视频的格式可以使用flvparse工具查看如下图所示

记录一次Flash播放加密视频实现_第8张图片
测试文件视频的结构

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);

播放效果:

记录一次Flash播放加密视频实现_第9张图片
image.png

如果播放不成功可以根据控制台提示的信息进行操作,比如提示没有crossdomain.xml 文件。需要将该文件放在视频所处的根目录下。

记录一次Flash播放加密视频实现_第10张图片
image.png

crossdomain.xml文件在工程中是存在的如下图,直接移动过去就行


记录一次Flash播放加密视频实现_第11张图片
image.png

你可能感兴趣的:(记录一次Flash播放加密视频实现)