如何在不重新编码的情况下合并两个视频

时间:2018-03-19 19:59:39

标签: ffmpeg

我正在尝试合并两个视频而不重新编码它们。

目前我使用的方法既耗时又耗费资源。我只是想合并而不重新编码它们。目前我正在使用

        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" );

上面需要花费很多时间..我想快速做一下。

1 个答案:

答案 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版本而异。

the docs.

中有自动生成文件的提示

注意:所有剪辑必须已经存在或命令失败,因为解码不会开始直到读取整个列表。

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.

来源: 经验

https://ffmpeg.org/ffmpeg-formats.html