如何混合多个视频并使它们不相互重叠?我需要使用 -filter_complex,因为我在那里塞入了更多命令,而且当我修剪视频时,它的帧仍然保留并与其他视频重叠,这似乎很奇怪。我还使用 tpad 将视频应该被剪切的地方涂成黑色,但它只会使黑色图像与其他视频重叠。
如何使用 mix 修剪和定位视频,并确保其帧不会重叠?这是没有 tpad 的版本
./ffmpeg.exe -i input1.mp4 -i input2.mp4 -filter_complex "[0]trim=start=0:end=5[t0];[1]trim=start=5:end=10[t1];[t0][t1]mix=inputs=2" ./output.mp4
添加 tpad 重叠时,框架和黑色图像混合在一起
./ffmpeg.exe -i input1.mp4 -i input2.mp4 -filter_complex "[0]trim=start=0:end=5[t0];[1]trim=start=5:end=10,setpts=PTS-5/TB,tpad=start_duration=5:start_mode=add:color=black@0x00[t1];[t0][t1]mix=inputs=2" ./output.mp4
tpad 中的 alpha 似乎也没有任何作用。
更新:
感谢 Sark 的回答,我找到了如何使用复杂的脚本来生成 concat 过滤器的命令来实现它。但结果仍然很笨重,并且需要额外的输入来生成空白空间,以防视频中间或两侧有黑色空间。
工作原理如下:
- 按时间线时间 + trimStart 对输入进行排序。顺序在连接中很重要。
- 添加黑色生成器作为输入。
- 在每个空白处插入黑色。
- 每次修剪后重置 PTS,其中开始 > 0。
下面是将 1 个视频分成两个 5 秒部分的示例,每个部分之间都有 5 秒的黑色空间。
./ffmpeg.exe -i input1.mp4 -f lavfi -i "color=c=black:s=1920x1080" -filter_complex "[0]trim=0:5[t0];[1]trim=0:5[t1];[0]trim=5:10,setpts=PTS-STARTPTS[t2];[t0][t1][t2]concat=n=3" -an output.mp4
有没有更简单的方法呢?
答案1
在下面的示例中,[0:0]
是第一个输入的视频流。[0:1]
是第一个输入的音频流。我们用它atrim
来修剪音频以匹配修剪后的视频。n=
是输入(不是流)的数量。v=1
&a=1
表示输出视频和音频流的数量,然后将它们映射到同一个输出文件。
trim
注意: /过滤器不需要开始和结束atrim
,只需用冒号分隔值。
ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex ^
[0:0]trim=0:3[outv0];[0:1]atrim=0:3[outa0];^
[1:0]trim=0:3[outv1];[1:1]atrim=0:3[outa1];^
[outv0][outa0][outv1][outa1]concat=n=2:v=1:a=1[v][a] -map [v] -map [a] out.mp4
您可以在修剪和连接之前对任一/两个输入应用额外的过滤,方法是将第二行更改为以下内容,以降低第一个输入的饱和度。
[0:0]eq=saturation=0[VS];^
[VS]trim=0:3[outv0];[0:1]atrim=0:3[outa0];^
或者,您可以按如下方式过滤连接的视频流。
[outv0][outa0][outv1][outa1]concat=n=2:v=1:a=1[v][a];[v]eq=saturation=0[v1] -map [v1] -map [a] out.mp4
编辑。
要在剪辑之间添加 5 秒持续时间的黑帧,可以使用以下命令。
注意:setpts
每次修剪过滤器之后通常可以解决可能出现的播放时间问题。
ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black:1920*1080:d=5 -filter_complex ^
[0]trim=0:5,setpts=PTS-STARTPTS[00];^
[1]trim=0:5,setpts=PTS-STARTPTS[11];^
[00][2][11]concat=n=3 -an out.mp4