很多视频链接都是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 将它们合并起来即可。

标签: m3u8

添加新评论

0%