首先我先说明一下我的使用场景和错误原因:
我使用IDM从网站中批量下载ts文件,然后下载对应的一个.m3u8文件(ts文件列表和加密信息的描述)和一个key.key文件(秘钥)。以上文件全部保存在同一目录下。
然后使用FFmpeg命令来解密并合并ts文件。命令为:ffmpeg -i index.m3u8 -c copy out.ts
由于ffmpeg 可以自动加载解密文件,所以很方便。但是提示以下错误:
从图片中可以得知,有两个错误。其中第二个错误往往就是由于第一个错误导致的,所以先解决第一个错误。可以看到提示key.key文件无法识别,因为.key不是内置的文件格式,网上有人 提出将.key后缀改成.m3u8,这样就可以读取文件了。但是这样子解决了第一问题,第二个还是没有解决。
经过摸索之后,我发现使用原始的m3u8文件链接(就是你从网上下载m3u8文件时使用的连接)没有第一个错误同时也没有第二个错误,可以 完美运行,比如使用如下的命令:
ffmpeg -i "http://www.example.com/index.m3u8" -c copy out.ts
这样就可以直接下载ts文件并成功解密、合并。这样与本地使用的区别是使用了网络中的key.key,而不是使用本地下载好的key.key。具体为什么这样可以,暂时我还不可知。
得知这些信息之后,对本地的m3u8文件做修改,修改其#EXT-X-KEY:METHOD=AES-128,URI="key.key" 中的"key.key"为"http://www.example.com/key.key"。但是修改之后还是会报以下错误:
所以,很明显将http添加在protocol_whitelist中即可。
修改ffmpeg的命令如下:
ffmpeg -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.ts
大功告成!
只要添加-allowed_extensions ALL就可以直接使用本地的key.key文件了,完整代码如下
ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.mp4
标签:文件,ffmpeg,错误,m3u8,when,ts,key
From: https://www.cnblogs.com/xialigang/p/16914300.html