HLS
又开始研究视频流了,让我们先看m3u8的播放.
浏览器可以直接播放m3u8,但是我们经常看见直播流配合hls.js播放,那什么时候用哪个?
- 原生video标签:你有一个视频文件,转成了标准H.264+AAC+TS格式,放在服务器上供用户点播,且不需要切换清晰度
- hls.js:做直播(秀场、赛事、会议)
- 做直播(秀场、赛事、会议)
- 视频编码是H.265
- 需要多清晰度自适应,适配不同网络环境的用户
- 需要精细控制播放(如精确Seek、错误重试、自定义缓存策略)
生成视频流
可以使用ffmpeg
1
2
3
4
5
6
ffmpeg -i 63156181.mp4 \
-c:v h264 -c:a aac \
-hls_time 10 \
-hls_list_size 0 \
-hls_segment_filename "output_%03d.ts" \
play.m3u8
这是一种标准的封装
也可以使用一种叫做AES128的对称加密来加密ts流,方法如下
第一步,生成16字节密钥
1
openssl rand 16 > enc.key
第二步,配置密钥描述
1
2
3
4
5
cat > test.txt <<'EOF'
这一行放公网可访问的密钥地址
本地密钥文件路径
IV向量(可选,也是16字节,填入Hex)
EOF
第三步,调用ffmpeg
其实就多加了一行
1
2
3
4
5
6
7
ffmpeg -i 63156181.mp4 \
-c:v h264 -c:a aac \
-hls_time 5 \
-hls_list_size 0 \
-hls_segment_filename "output_%03d.ts" \
-hls_key_info_file ./enc.keyinfo \
play.m3u8
看看m3u8结构
1
2
3
4
5
6
7
8
9
10
11
12
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:14
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.166667,
output_000.ts
#EXTINF:9.966667,
output_001.ts
#EXTINF:9.866667,
output_002.ts
...
#EXT-X-ENDLIST
特殊加密策略
为什么说hls+aes128万恶呢,因为互联网上加密根本没有上面说的这么简单。
很多服务器上了CSRF Token,再加上他们这个所谓“密钥”根本不是16字节,可能比这个长得多,先拉取,然后用自己魔改的脚本解密这个密钥。
这样密钥的计算就需要很多逆向工程了。