学习使用ffmpeg Dash视频加密

  1. 安裝 Bento4-SDK-1-5-1-628.x86_64-unknown-linux.zip

我使用 Chrome 打开 Downloads,这个页面,我选的是Binaries for Linux x86_64,右键这个链接,选择 "复制链接地址"就可以获取到 下载的链接了

1
2
3
4
5
6
7
8
cd /tmp
wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-5-1-628.x86_64-unknown-linux.zip
sha1sum Bento4-SDK-1-5-1-628.x86_64-unknown-linux.zip
sudo unzip -o -d /opt/ Bento4-SDK-1-5-1-628.x86_64-unknown-linux.zip
sudo mv /opt/Bento4-SDK-1-5-1-628.x86_64-unknown-linux /opt/bento4_sdk_1.5.1.628
sudo vim /etc/profile
source /etc/profile # 編輯完 /etc/profile之後,加載 /etc/profile文件
mp4info # 測試 Bento4 sdk 是否加入環境變量成功

/etc/profile中添加 BENTOSDK_HOME,再在 $PATH前追加 ${BENTOSKD_HOME}/bin

1
2
3
export MY_PHP_HOME=/opt/lampp
export BENTOSDK_HOME=/opt/bento4_sdk_1.5.1.628
export PATH=${MY_PHP_HOME}/bin:${BENTOSDK_HOME}/bin:$PATH

如果當前系統中沒有/opt/lampp這個路徑,可以將 export MY_PHP_HOME=/opt/lampp${MY_PHP_HOME}/bin: 刪除掉


sha1sum 獲取壓縮文件的 sha1,上面獲取到的 sha1值,獲取到壓縮包sha1和下載頁面的 sha1 47959b638897a4fc185b0ed1f194bdf13194af45 Bento4-SDK-1-5-1-628.x86_64-unknown-linux.zip 是一致


上面的unzip 是将文件解压到 opt目录下,
-o : 不提示的情况下覆盖文件;
-d : 指明 压缩文件要解压到的文件夹

  1. 加密
1
2
3
4
5
6
7
$ openssl rand -hex 16
84e047940b3e1dcb722617ed412de104
$ openssl rand -hex 16
ebd89de15d684dcff6b6e792729b50c8
$ mp4fragment 80s_sd.mp4 80s_sd_fragmented.mp4
$ mp4encrypt --method MPEG-CENC --key 1:84e047940b3e1dcb722617ed412de104:random --property 1:KID:ebd89de15d684dcff6b6e792729b50c8 --key 2:84e047940b3e1dcb722617ed412de104:random --property 2:KID:ebd89de15d684dcff6b6e792729b50c8 --global-option mpeg-cenc.eme-pssh:true 80s_sd_fragmented.mp4 80s_sd_e.mp4
$ mp4dash -o ./80e_dash 80s_sd_e.mp4

播放 dash的網頁代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html>
<head>
<title>dash实例</title>
</head>

<body>

<video id="videoPlayer" controls></video>
<script type="text/javascript" src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script type="text/javascript">
$(function () {
var player = dashjs.MediaPlayer().create();
player.initialize();
player.attachView(document.getElementById('videoPlayer'));
player.attachVideoContainer(document.body);
player.setAutoPlay(true);
player.setProtectionData({
'org.w3.clearkey': {
'serverURL': 'http://localhost/test2/drm.php' //授权服务器地址
}
});
player.attachSource('http://localhost/test2/80e_dash/stream.mpd'); //视频文件地址
});
</script>
</body>
</html>

簡易授權服務器代碼

drm.php 文件的內容

1
2
3
4
5
6
7
8
9
10
11
12
<?php
header("Access-Control-Allow-Origin: *");

$data = array(
'keys' => [
[
'kid' => "syb4lbaiTMWk3HCZVygFnA",
'k' => "YX2KElooTfSOPGsYZjSKPw",
]
]
);
exit(json_encode($data));

后记:

因自己的技术原因,导致生成的dash分片,在播放的时候,会出现卡顿现象,故暂时使用 hls加密视频的方案


Reference
  1. 加密视频播放实施方案一:Dash.js
  2. Linux下的压缩zip,解压缩unzip命令详解及实例
  3. linux中校验文件完整性(md5,sha1)
  4. 加密视频播放实施方案一:Dash.js