VLC无法播放m3u8文件、ffmpeg解密报错问题求助
问题核心原因
你下载的keyfile.txt不是FFmpeg可直接读取的16字节原始AES-128密钥,而是一段Base64编码的JSON格式加密配置,FFmpeg无法识别该格式的密钥,因此解密分片失败报错。
解决步骤
- 第一步:解码
keyfile.txt的Base64内容
将keyfile.txt中的字符串做Base64解码,得到如下结构的JSON数据:
{ "passphrase": "614b49563a7eb", "ciphertext": "ejfNMdRf9mcvxGRQLX6qS+jRINfZPbr1urhXaMVuAZmIJWeWX2FKCKuCFBaD0cqX", "iv": "1e3e787f3cbde8ebd7ee0d5ead056a34", "salt": "06773b59a5cb1f0787dba3e00aff4b37" }
- 第二步:解密得到真实AES密钥
用JSON中的passphrase、iv、salt参数解密ciphertext字段,得到16字节的真实AES密钥。可参考如下Python代码完成解密:
import base64 from Crypto.Cipher import AES from Crypto.Protocol.KDF import PBKDF2 # 解码后JSON的对应字段值 passphrase = b"614b49563a7eb" ciphertext = base64.b64decode("ejfNMdRf9mcvxGRQLX6qS+jRINfZPbr1urhXaMVuAZmIJWeWX2FKCKuCFBaD0cqX") iv = bytes.fromhex("1e3e787f3cbde8ebd7ee0d5ead056a34") salt = bytes.fromhex("06773b59a5cb1f0787dba3e00aff4b37") # 生成解密用密钥 aes_key = PBKDF2(passphrase, salt, dkLen=16, count=1000) cipher = AES.new(aes_key, AES.MODE_CBC, iv) # 解密得到真实的分片解密密钥 real_decrypt_key = cipher.decrypt(ciphertext).strip()[:16] # 保存为二进制密钥文件 with open("real.key", "wb") as f: f.write(real_decrypt_key)
- 第三步:修改m3u8文件配置
将m3u8文件中所有#EXT-X-KEY行的URI参数替换为新生成的真实密钥文件名:
#EXT-X-KEY:METHOD=AES-128,URI="real.key",IV=0x00000000000000000000000000000001
无需修改每行对应的IV值,保持原有配置即可
- 第四步:执行FFmpeg合并命令
重新运行原命令即可完成分片解密和合并:
ffmpeg -allowed_extensions ALL -i "play.m3u8" -c copy "test.ts"
异常排查
如果操作后仍然报错,可按以下点核对:
- 确认所有.ts分片文件下载完整,文件名与m3u8中配置完全一致,无缺失、损坏
- 确认生成的
real.key是16字节的二进制文件,不要保存为文本格式 - 可在FFmpeg命令中添加
-loglevel debug参数,输出详细错误信息定位问题
内容的提问来源于stack exchange,提问作者Novice At Everything
相关产品推荐
相关产品推荐

