我正在尝试合并两个视频而不重新编码。
目前我使用的方法过于耗时和资源。我只是想合并而不重新编码它们。目前我正在使用
exec ( "cpulimit -l 90 ffmpeg -i $filename1 -qscale 0 $intermediate1 &> stream1.log" );
exec ( "cpulimit -l 90 ffmpeg -i $filename2 -qscale 0 $intermediate2 &> stream2.log" );
$output = '/var/www/html/myserver/merg/'.uniqid().'_merge.'.$ext;
exec ( "cpulimit -l 90 cat $intermediate1 $intermediate2 | ffmpeg -i - -qscale 0 $output &> stream3.log" );
上面需要很多时间..我想要一个快速的方法来做到这一点。
具有相同编解码器的文件串联:
ffmpeg 中有两种方法可用于连接相同类型的文件: concat 解复用器和 concat 协议
解复用器更加灵活——它需要相同的编解码器,但可以使用不同的容器格式;它可以与任何容器格式一起使用,而 concat 协议仅适用于选定的几个容器。
concat 解复用器说明:
按以下格式创建名为 vidlist.txt 的文本文件:
file '/path/to/clip1'
file '/path/to/clip2'
file '/path/to/clip3'
请注意,这些路径可以是相对路径或绝对路径。
如果您希望连接一堆全部驻留在其中的文件,则可选 在同一目录中,您可以使用简单的循环来生成文件:
for f in *.mkv; do echo "file '$f'" >> vidlist.txt; done
然后发出命令:
ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output
如果不太清楚,请将输出替换为您想要生成的视频文件名(无论是output.mp4、output.mkv、output.avi),ffmpeg 将使用扩展名指示的容器。
文件将按照它们在 vidlist.txt 中出现的顺序流式复制到输出容器中。 “复制编解码器”速度非常快。编辑:请注意,虽然文档说如果路径是相对的,则不需要
-safe 0
,但我的测试表明这是一个要求。这可能会因您的 ffmpeg 版本而异。
文档中提供了自动生成文件的提示。注意:所有剪辑必须已经存在,否则命令将失败,因为在读取整个列表之前解码不会开始。
concat协议说明:
ffmpeg -i "concat:video1.ts|video2.ts|video3.ts" -c copy output.ts
注意:如上所述,concat 协议在它支持的流和容器方面受到严格限制,所以我从不使用它。以上内容只是为了创建一个彻底的答案。对于大多数项目来说,concat 解复用器是更好的选择。
另一个建议:
就个人而言,我更喜欢使用 Matroska 容器,因为它灵活且开销较低,并使用mkvmerge -o output.mkv input1.mkv + input2.mkv
加入具有相同编码的视频
如果您的剪辑不使用相同的音频和视频编解码器和/或具有不同的速率,则在加入之前您会卡住重新编码为中间文件,众所周知,这既消耗时间又消耗资源。
请注意,特殊字符
可能会破坏某些内容,因此如果您的文件名中包含这些字符,则需要处理它们。 来源: 经验
https://ffmpeg.org/ffmpeg-formats.html