使用ffmpeg垂直或水平堆叠(马赛克)多个视频?

使用ffmpeg垂直或水平堆叠(马赛克)多个视频?,ffmpeg,video-processing,Ffmpeg,Video Processing,我有两个完全相同长度的视频,我想使用ffmpeg将它们堆叠到一个视频文件中 我怎样才能做到这一点呢?看看这个问题,找到一种更新、更简单的方法 旧版本: 您应该能够使用FFmpeg中的、和过滤器来执行此操作。该命令将如下所示: ffmpeg -i top.mov -vf 'pad=iw:2*ih [top]; movie=bottom.mov [bottom]; \ [top][bottom] overlay=0:main_h/2' stacked.mov 首先,应该放在顶部的电影被填充到

我有两个完全相同长度的视频,我想使用ffmpeg将它们堆叠到一个视频文件中

我怎样才能做到这一点呢?

看看这个问题,找到一种更新、更简单的方法


旧版本:
您应该能够使用FFmpeg中的、和过滤器来执行此操作。该命令将如下所示:

ffmpeg -i top.mov -vf 'pad=iw:2*ih [top]; movie=bottom.mov [bottom]; \
  [top][bottom] overlay=0:main_h/2' stacked.mov
首先,应该放在顶部的电影被填充到两倍的高度。然后加载底部电影。然后,底部电影以填充电影高度一半的偏移量覆盖在填充的顶部电影上。

使用(垂直)、(水平)或(自定义布局)过滤器。它比其他方法更简单、更快

示例1:合并/堆叠两个视频或图像 垂直的 使用过滤器

视频必须具有相同的宽度

水平的 使用过滤器

视频必须具有相同的高度

有边界 使用过滤器。此示例在两侧之间创建5px黑色边框


示例2:同上,但带有音频 向下混合并使用原始通道放置

添加以组合来自两个输入的音频通道:

ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output
  • 这假设每个输入包含一个立体声音频流

  • -ac 2
    用于在两个输入都包含多声道音频的情况下将混音下混音到立体声。例如,如果两个输入都是立体声,如果省略
    -ac 2
    ,则将获得4声道输出音频流,而不是立体声

将每个输入的所有音频放入单独的通道

使用(或)和过滤器:

添加静音音频/如果一个输入没有音频 如果混用有音频的输入和没有音频的输入,则amerge将失败,因为每个输入都需要音频。您可以使用添加静音音频以防止出现这种情况:

ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];anullsrc[silent];[0:a][silent]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output.mp4

例3:三个视频或图像

如果您想要垂直,请使用vstack而不是hstack


示例4:2x2网格

使用 使用及 这种语法更容易理解,但不如上面所示的使用xstack有效


示例5:带文本的2x2网格

使用过滤器:


示例6:调整输入的大小/比例 由于这两个视频对于vstack需要具有相同的with,对于hstack需要具有相同的高度,因此您可能需要缩放其中一个视频以匹配另一个视频:

将input0的宽度设置为640并在保留纵横比的同时自动设置高度的简单过滤器示例:

ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
  • 有关在保留纵横比的同时将任意大小的视频适配到特定大小的更高级方法,请参阅

  • 您还可以使用过滤器自动调整一个视频的大小,以匹配另一个视频的尺寸


示例7:延迟/暂停视频 此示例将播放左上角的视频,同时暂停其他视频。左上角视频结束后,将播放右上角视频,依此类推

使用、和过滤器:

  • 本例假设每个输入持续时间为5秒。根据需要调整
    start\u duration
    adelay

  • 此命令需要FFmpeg 4.2或更新版本

  • 如果您不喜欢xstack的复杂性,可以使用几个hstack/vstack,如示例4:2x2网格所示

对于2个视频:

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex hstack out.mp4
有关更多视频(本例中为3个):


ffmpeg
报告
没有这样的过滤器:“vstack”
。我必须先安装吗?@frans你现在可能已经知道了,但是你的
ffmpeg
太旧了。建议用户使用从当前git主分支派生的
ffmpeg
构建。
流说明符:filtergraph描述[0:v][1:v]vstack[v]中的“a”;[0:a][1:a]amerge=inputs=2[a]不匹配任何流。
为什么我会得到此结果?@RaduM its因为您的一个视频中没有音频,您需要在其中添加音频或无声音频,使用两个有音频的视频尝试相同的命令,它会工作,我之所以发帖,是因为我今天也遇到了同样的问题,并使用无声音频加法纠正了它。ffmpeg-I front.avi-I front.avi-I front.avi-I front.avi-filter_complex“[0:v][1:v][2:v]hstack=3[top];[3:v][4:v][5:v]hstack=3[bottom bottom 3];[top][bottom bottom bottom vstack[v]“-map”[v]“output.avi。。。。。。。。。。。。。。。但我无法打开avi文件
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c1|c1<c2+c3[a]" -map "[v]" -map "[a]"  output
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 1:a output
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];anullsrc[silent];[0:a][silent]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output.mp4
ffmpeg -i input0 -i input1 -i input2 -filter_complex "[0:v][1:v][2:v]hstack=inputs=3[v]" -map "[v]" output
ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex "[0:v][1:v][2:v][3:v]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]" -map "[v]" output
ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2[v]" -map "[v]" output
ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex
"[0]drawtext=text='vid0':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v0];
 [1]drawtext=text='vid1':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v1];
 [2]drawtext=text='vid2':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v2];
 [3]drawtext=text='vid3':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v3];
 [v0][v1][v2][v3]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]"
-map "[v]" output
ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
ffmpeg -i top-left.mp4 -i top-right.mp4 -i bottom-left.mp4 -i bottom-right.mp4 -filter_complex "[1]tpad=start_mode=clone:start_duration=5[tr];[2]tpad=start_mode=clone:start_duration=10[bl];[3]tpad=start_mode=clone:start_duration=15[br];[0][tr][bl][br]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v];[1:a]adelay=5s:all=true[a1];[2:a]adelay=10s:all=true[a2];[3:a]adelay=15s:all=true[a3];[0:a][a1][a2][a3]amix=inputs=4[a]" -map "[v]" -map "[a]" output.mp4
ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex hstack out.mp4
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex hstack=3 out.mp4