欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

ffmpeg合并m3u8 ts key文件 解决Invalid data found when processing input错误

ffmpeg合并m3u8 ts key文件 解决Invalid data found when processing input错误

2018年02月23日 00:29:02 爱明_爱夏 阅读数:12129                
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014484783/article/details/79350392

首先我先说明一下我的使用场景和错误原因:

 

  1. 我使用IDM从网站中批量下载ts文件,然后下载对应的一个.m3u8文件(ts文件列表和加密信息的描述)和一个key.key文件(秘钥)。以上文件全部保存在同一目录下。

  2. 然后使用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
               

大功告成!

-------------------------------------------2019-01-11 更新------------------------------------------------------------------------

只要添加-allowed_extensions ALL就可以直接使用本地的key.key文件了,完整代码如下                

ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.mp4
               

 

 

 

普通分类: