问题出现在使用concat协议进行拼接两个mp4视频的时候, 使用了下面的命令进行拼接,结果出现了如上的报错,Found duplicated MOOV Atom. Skipped ,结果只是把第一个视频拷贝一遍就结束了。
ffmpeg -i "concat:001.mp4|002.mp4" -c copy out.mp4
原理上是因为 concat协议,实际上就只是把两个视频直接拼接,把后一个视频直接贴到前一个视频后面而已,因此只会适用于ts和flv等一些格式。mp4格式整体有一层容器,而不像ts这类格式可以直接拼接,需要先解开容器再对提取的视频流进行拼接。
之前我在查ffmpeg视频拼接的方法的时候,就了解到两种方法。当时我知道平时用的其他工具比如下载m3u8的视频,或者下载b站的视频分段的时候都是用的第二种方法,就是创建一个新文件,把文件列出来执行concat命令。当时我就发现了第一种方法的一个缺陷是,文件太多的时候不适用。文件名会拼起来很长。
现在了解到了第一种方法只是简单的拼接。而第二种还会对容器进行处理,具体操作方式如下
创建一个mylist.txt文件如下:
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
执行下面的命令
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output