我想连接两个或更多视频,使用前缘柔性柔性管道但加入视频后出现音频/视频同步问题,我使用了以下代码
ffmpeg -i input1.flv -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.flv -qscale:v 1 intermediate2.mpg
ffmpeg -i input3.flv -qscale:v 1 intermediate3.mpg
ffmpeg -i input4.flv -qscale:v 1 intermediate4.mpg
cat intermediate1.mpg intermediate2.mpg intermediate3.mpg intermediate4.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
output.avi 中的音轨位于视频轨道之前。
答案1
像这样使用cat
可能会导致不可预测的问题。幸运的是,有两种非常有用的方法可以使用 ffmpeg 连接文件。
康卡特解复用器
如果所有输入都是相同类型的文件(相同的编解码器等),那么您可以使用 concat demuxer。这可能是对您的问题更有用的答案,因为它与 -c copy 兼容(因此应该是无损的,并且几乎只需要很短的时间即可完成)。
首先,创建一个名为的文件,inputs.txt
包含以下内容:
file '/path/to/input1.flv'
file '/path/to/input2.flv'
file '/path/to/input3.flv'
file '/path/to/input4.flv'
然后使用以下命令:
ffmpeg -f concat -i inputs.txt -c copy output.flv
如果这不起作用,或者你想合并不同类型的视频,你可以使用
康卡特筛选
ffmpeg -i input1.flv -i input2.flv -i input3.flv -i input4.flv \
-filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] [3:0] [3:1] concat=n=4:v=1:a=1 [v] [a]' \
-map '[v]' -map '[a]' -c:v libx264 -crf 22 -preset veryfast -c:a libfdk_aac -vbr 3 -afterburner 1 output.mp4
此示例使用了我喜欢的编码设置,显然更改最后一行以使用您想要的任何设置。
我将分解 -filter_complex 部分,以便于理解。
'[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] [3:0] [3:1]
此片段告诉 ffmpeg 要将哪些流发送到 concat 过滤器;在本例中,来自输入 0 的流 0 和 1(ffmpeg 从 0 开始计数,因此这是来自第一个输入文件(本例中为 input1.flv)的第一个和第二个流),以及直到第四个(根据 ffmpeg 的说法是输入 3,它从 0 开始计数)的每个输入的流 0 和 1。
concat=n=4:v=1:a=1 [v] [a]'
这是 concat 过滤器本身。n=4 告诉过滤器有 4 个输入文件;v=1 告诉它将有一个视频流;a=1 告诉它将有一个音频流(我知道我说过 ffmpeg 从 0 开始计数,但显然这个过滤器的编写者决定这样做)。
[v] 和 [a] 是输出流的名称,允许 ffmpeg 行的其余部分使用 concat 过滤器的输出。我认为它们可以有任意名称;哪个是视频,哪个是音频可能由它们的相对位置决定,但我还没有测试过。
请注意,整个过滤器部分都需要用单引号“ ”引起来。
-map '[v]' -map '[a]'
这告诉 ffmpeg 使用 concat 过滤器的结果而不是直接来自输入文件的流。
请注意,过滤器与流复制不兼容;您不能将 -c copy 与此方法一起使用。我还认为它无法处理软字幕,尽管我还没有测试过:文档中没有关于它的提示,但 ffmpeg 文档通常不完整或模糊,所以无论如何这都不是一个肯定的迹象。
这可以连接以不同格式编码的文件(我已经使用 h264/aac MP4 和 vpx/vorbis WEBM 测试过,效果很好),尽管它们需要具有相同的视频帧大小和音频深度(可能还有其他东西)。
也可以看看这里。