我正在尝试合并两个视频而不重新编码它们。
目前我使用的方法既耗时又耗费资源。我只是想合并而不重新编码它们。目前我正在使用
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" );
上面需要花费很多时间..我想快速做一下。
答案 0 :(得分:11)
具有相同编解码器的文件的连接:
ffmpeg中有两种方法可用于连接相同类型的文件: the concat demuxer & the concat protocol
分路器更灵活 - 它需要相同的编解码器,但可以使用不同的容器格式;它可以与任何容器格式一起使用,而concat协议只适用于少数几个容器。
concat demuxer说明:
以下列格式创建名为vidlist.txt的文本文件:
file '/path/to/clip1'
file '/path/to/clip2'
file '/path/to/clip3'
请注意,这些可以是相对路径或绝对路径。
然后发出命令:
ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output
文件将按照它们在vidlist.txt中出现的顺序流复制到输出容器中。 "复制编解码器" 快速燃烧。
修改:请注意,虽然文档说如果路径是相对的,您不需要-safe 0
,我的测试表明它是一项要求。这可能会因您的ffmpeg版本而异。
注意:所有剪辑必须已经存在或命令失败,因为解码不会开始直到读取整个列表。
concat协议说明:
ffmpeg -i "concat:video1.ts|video2.ts|video3.ts" -c copy output.ts
注意:如上所述,concat协议在它支持的流和容器中受到严格限制,所以我从不使用它。以上内容仅包含在尝试创建完整答案中。对于大多数项目来说,concat demuxer是更好的选择。
另一种建议:我个人更喜欢使用Matroska容器,因为它具有灵活性和低开销,并使用mkvmerge -o output.mkv input1.mkv + input2.mkv
使用不同编解码器的文件的连接:
如果您的剪辑不使用相同的音频和视频编解码器和/或具有不同的速率,那么在加入之前您将重新编码到中间文件,我们都知道这些文件耗费时间和资源。< / p>
请注意,special characters可能会破坏内容,因此如果您的文件名中包含这些内容,则需要deal with them.
来源: 经验