视频切片加密后播放

最近网上大学想下载一个视频,但下载下来的ts文件不能播放,把m3u8文件下载下来一看里面有

#EXT-X-KEY:METHOD=AES-128,URI="https://kc.zhixueyun.com/hls/9fd5d229-3b75-11e7-b669-44a84230d603",IV=0xd9221589c954ff5538bdc9af225e3e9e

里面的EXT-X-KEY:METHOD=AES-128说明服务器方在把文件切片成ts文件然后播放时进行了加密,所以我们先把m3u8这个文件下载下来,看有多少个ts文件,然后要把uri这个文件和所有ts文件下载下来(迅雷批量下载)放一个文件夹,把上面文件中的uri地址改成本地地址,用迅雷影音就可以直接打开m3u8文件播放。

一般hls视频流加密我们用到常见的一种是防盗链(严格来讲这不属于加密) , 也就是说给 m3u8 和 ts 文件的url动态生成一个 token , 比如这个:

http://www.cuplayer.com/m3u8/hunan/desc.m3u8?stream_id=hunan<m=1410595018&lkey=8bc1e0fe35f6321ef560f8ccffb70e5d&path=59.49.42.14,58.59.3.9,58.59.3.51&platid=10&splatid=1015&tag=live&cips=127.0.0.1&ext=m3u8&sign=live_tv

这个url是随着很多参数动态变化的,比如时间,用户id、ip地址,内容id , 导致你无法使用这个url盗链,这种方式可以防止其他网站直接使用你的url来观看或者一般用户的下载。

而ts文件的url 也需要加请求token , 会变化成类似 http://server/file.ts?token=xxxx 的方式, 这样的话, ts文件的磁盘存储位置不用变化,但是url是可以变化的(可以用query string方式,也可以用 url rewrite 方式), 注意因为url是m3u8生成的,意味着m3u8文件是动态生成而并非静态文件

另一种就是我上面说的DRM加密,用来给ts内容加密, m3u8有这个tag: #EXT-X-KEY

下面是网上找的如何把一个mp4视频使用ffmpeg视频切片并加密和视频AES-128加密后播放

创建加密文件:将一个mp4视频文件切割为多个ts片段,并在切割过程中对每一个片段使用AES-128 加密,最后生成一个m3u8的视频索引文件;

1.加密用的key(文件则保存当前目录)

指令:openssl rand -base64 20 > enc.key

提示打开文件本次生成的 n4DHLx7kMPeewvW3dGlm5i/EE8I=

2.另一个是iv(生成一段字符串,记下来):

指令:openssl rand -hex 16

提示打印出本次生成的682f5033538cf71567e1bdb38f5f9a07

新建一个文件enc.keyinfo 内容格式如下:
Key URI # enc.key的路径,使用http形式
Path to key file # enc.key文件
IV # 上面生成的iv

实例:
http://edu.gamagou.cn/enc.key
/usr/share/nginx/html/enc.key
682f5033538cf71567e1bdb38f5f9a07

  1. ffmpeg加密指令:

/home/programs/video/ffmpeg/ffmpeg -y -i /home/programs/video/test/123.mp4 -hls_time 12 -hls_key_info_file /home/programs/video/conf/enc.keyinfo -hls_playlist_type vod -hls_segment_filename “file%d.ts” playlist.m3u8

加密后的文件形式:

EXTM3U
EXT-X-VERSION:3
EXT-X-TARGETDURATION:12
EXT-X-MEDIA-SEQUENCE:0
EXT-X-PLAYLIST-TYPE:VOD
EXT-X-KEY:METHOD=AES-128,URI=”https://edu.amin.cc/enc.key”,IV=0x15de9b7283a69d7ef11f6f12e488fbb7
EXTINF:12.040000,

file0.ts

EXTINF:10.440000,

file1.ts

EXT-X-ENDLIST
  1. 播放部分:
    jq控件:hls.js
    手册:https://www.bootcdn.cn/hls.js/readme/

播放页面:

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<!-- Or if you want a more recent canary version -->
<!-- <script src="https://cdn.jsdelivr.net/npm/hls.js@canary"></script> -->
<video id="video"></video>
<script>
  var video = document.getElementById('video');
  if(Hls.isSupported()) {
    var hls = new Hls();
    hls.loadSource('https://替换你的文件路径.m3u8');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED,function() {
      video.play();
  });
 } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    video.src = 'https://替换你的文件路径.m3u8';
    video.addEventListener('loadedmetadata',function() {
      video.play();
    });
  }
</script>

完成。