我正在尝试处理包含(可能加密的)HLS 流的远程 m3u8 播放列表。我正在寻找的输出是一个内部带有 MPEG-4 的 mp4 容器。
播放列表是直播结束的结果,可能包含 EXT-X-DISCONTINUITY 标签。据我了解,没有“内置”方式来处理它,实际上,有很多警告,如“输出流中的非单调 DTS”,并且生成的文件总是有一些播放问题。
有几个选项可以“粘合”它。在未加密的流上,我发现concat demuxer可以产生播放问题最少的结果。命令是:
LIST=chunks.list; ffmpeg -loglevel 'debug' -f concat -safe 0 -protocol_whitelist "file,http,https,tcp,tls,crypto" -i $LIST -c copy -movflags frag_keyframe -y output_concat.mp4
chunks.list
类似的东西在哪里:
file 'https://www.example.org/chunk1.ts'
file 'https://www.example.org/chunk2.ts'
file 'https://www.example.org/chunk3.ts'
现在,我正在尝试使用 concat demuxer 来处理加密的块。我已经尝试在不同的地方传递-key
和-iv
选项并更改chunks.list
为类似file 'crypto+https...'
但它不会获取加密密钥:
Opening an input file: chunks.list.
[concat @ 0x7f9fb6800c00] Opening 'chunks.list' for reading
[NULL @ 0x7f9fb6007e00] Opening 'crypto+https://www.example.org/chunk1.ts' for reading
[crypto @ 0x7f9fb5700a00] decryption key not set
[concat @ 0x7f9fb6800c00] Impossible to open 'crypto+https://www.example.org/chunk1.ts'
[AVIOContext @ 0x7f9fb5700780] Statistics: 5094 bytes read, 0 seeks
chunks.list: Invalid argument
文档提到了加密协议的加密选项,所以看起来只是以正确的方式传递这些选项。
当我不使用 concat demuxer 时,我尝试只处理和解密一个块,例如:
ffmpeg -i crypto+https://www.example.org/chunk1.ts -key <my_hex_key> -iv <my_iv> chunk1.ts
它工作正常。密钥本身没有问题,我可以使用其他工具(openssl 等)对其进行解密。
concat demuxer 是否可以处理解密?如果是这样,我应该在哪里通过key
和iv
选择?