如何使用 ffmpeg 或 youtube-dl 下载 aes 加密的 m3u8?

如何使用 ffmpeg 或 youtube-dl 下载 aes 加密的 m3u8?

我有m3u8文件和key.bin,m3u8文件里面有:

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.bin"
#EXTINF:6.000000,
segment-0.ts
...
#EXTINF:4.416667,
segment-159.ts
#EXT-X-ENDLIST

key.bin 文件里面有

Ú{±€rl”ÜJÌy«‡mó

如何使用 ffmpeg 或 youtube-dl 将其下载为 mp4?

答案1

您可以像这样使用 ffmpeg:

ffmpeg -i video.m3u8 -c copy -bsf:a aac_adtstoasc video.mp4

此外,如果 URL 是 https,您可以将 https 添加到允许的协议中,如下所示:

ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -i video.m3u8 -c copy -bsf:a aac_adtstoasc video.mp4

来源文章: 使用 ffmpeg 下载加密的 HLS 内容 - davd.io

答案2

如果您使用的是youtube-dl -o file.mp4 "m3u8-URL",您可能需要传递正确的标头,以便允许 youtube-dl/ffmpeg 下载密钥。使用--user-agent "USERAGENT"--referer "REFERRER_URL"参数。您需要使用与浏览器相同的用户代理 - 您可以在以下位置轻松找到您的用户代理ifconfig.me/ua,referer 是你嗅探到 m3u8 URL 的浏览器中的主 URL)

例如:

ua='User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0'
ref='Referer: https://play.example.com/'
m3u8='https://audio.api.streaming.example.com/hls/bu627ad3-b805-4n6d-9dc9-495fd113d47f/playlist.m3u8'

youtube-dl -o file.mp4 --user-agent "$ua" --referer "$ref" "$m3u8"

感谢来自 reddit 的那个提供解决方案的人。

答案3

如果您遇到诸如 之类的字段EXT-X-KEY,则URI首先需要解析相对于播放列表 URI 的值。因此,如果您有这样的内容:

http://example.com/hello/playlist.m3u8

那么结果 URI 将是:

http://example.com/hello/key.bin

完成后,您可以从 URI 获取数据,通常为 16 个字节或更多。然后您可以解析段 URI:

http://example.com/hello/segment-0.ts

并正常下载。接下来,您可以使用 AES-CBC 解密该段,使用来自 的数据key.bin作为 AES 密钥和 CBC IV。解密后,您需要删除任何填充(如果存在)。对所有段重复此过程。

RFC 8216 - EXT-X-KEY

相关内容