很多视频链接都是m3u8的,如果是未加密的,直接将其拖到视频软件中就能播放,其原理是读取 m3u8 里的视频片段地址,每个片段都是可以独立播放的 ts 格式,连接在一起就是一个完整的视频。
加密 M3U8 文件示例 有的m3u8文件是有加密的,比如这个文件:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="https://aaa.com/v/202303/02/26168/403e18fa"
#EXTINF:8.333333,
https://aaa.com/v/202303/02/26168/f1dbb_00000
#EXTINF:8.333333,
https://aaa.com/v/202303/02/26168/f1dbb_00001
对以上参数的说明:
-
每个视频片段的加密方式是:AES-128
-
加密的密钥文件是:https://aaa.com/v/202303/02/26168/403e18fa
-
每个视频片段时长 9s
-
每个视频片段的内容地址是https://aaa.com/v/202303/02/26168/f1dbb_0000x
如何获取解密视频?
如果要获取这个完整视频,你需要下载密钥文件和每个视频片段,解密后再合并 ts 文件即可。
其中解密过程如下:
假设下载的加密文件是403e18fa ,第一个视频片段是f1dbb_00000
加密文件大小需要是 16Byte,并将其改为 aes.key
使用openssl进行解密:
openssl aes-128-cbc -d -in ./f1dbb_00000 -out ./video_0.ts -nosalt -iv 0 -K $(xxd -p ./aes.key)
-
aes-128-cbc:使用AES-128位CBC模式进行解密
-
-d:执行解密操作
-
-in:输入的加密文件
-
-out:解密后的输出文件
-
-nosalt:密钥本身没有salt
-
-iv 0:使用全0的初始化向量
-
-K:密钥,使用xxd将aes.key转为十六进制字符串
这个命令会使用aes.key作为密钥,对f1dbb_00000进行AES-128位解密,解密后的视频写入video_0.ts。
可能会报错hex string is too short, padding with zero bytes to length
不过ts 文件已经解密成功了。
然后用脚本循环执行上述过程即可得到所有解密后的 ts 文件
解密之后,得到所有 ts 文件,用 ffmpeg 将它们合并起来即可。