垂直或水平堆栈使用的几部影片的ffmpeg?(Vertically or horizontally

2019-06-17 12:01发布

我有同样的确切长度的两个视频,我想用的ffmpeg将它们堆放到一个视频文件。

我怎样才能做到这一点?

Answer 1:

见这个答案对这个问题换做这个新的方式。


旧版:
你应该能够做到这一点使用的垫片 , 电影和覆盖在FFmpeg的过滤器。 该命令将是这个样子:

ffmpeg -i top.mov -vf 'pad=iw:2*ih [top]; movie=bottom.mov [bottom]; \
  [top][bottom] overlay=0:main_h/2' stacked.mov

首先,电影应该是在顶部被填充到其高度的两倍。 然后底部影片加载。 然后底部电影在半填充的影片的高度偏移覆盖在填充顶部的电影。



Answer 2:

使用vstack (垂直), hstack (水平),或的xStack (定制布局)过滤器。 它比其他方法更容易和更快。

实施例1:合并/堆叠两个视频

垂直

使用vstack过滤器。

ffmpeg -i input0 -i input1 -filter_complex vstack=inputs=2 output

影片必须具有相同的宽度。

使用hstack过滤器。

ffmpeg -i input0 -i input1 -filter_complex hstack=inputs=2 output

影片必须具有相同的高度。

随着边界

使用垫过滤。 这个例子创建了双方之间的5px的黑色边框。

ffmpeg -i input0 -i input1 -filter_complex "[0]pad=iw+5:color=black[left];[left][1]hstack=inputs=2" output

实施例2:同上,但与音频

从两个输入组合音频

添加amerge过滤器的音频通道从两个输入相结合:

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被包括以缩混到立体声的情况下,两个输入端含有多声道音频。 例如,如果两个输入都是立体声,你如果省略得到4通道输出音频数据流,而不是立体声-ac 2

从一个特定的输入使用音频

这个例子将使用音频input1

ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 1:a output

添加静音音频/如果一个输入没有音频

如果混合有音频和投入不具备音频然后amerge将会失败,因为每个输入需要音频输入。 您可以添加无声的音频, anullsrc过滤器 ,以防止这种情况:

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:三个视频

ffmpeg -i input0 -i input1 -i input2 -filter_complex "[0:v][1:v][2:v]vstack=inputs=3[v]" -map "[v]" output

实施例4:2×2网格

使用的xStack

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

使用hstack和vstack

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

该语法是更易于理解,但比如上所示使用的xStack效率较低。


实施例5:2×2网格文本

使用DrawText的过滤器:

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

实施例6:调整大小/秤的输入

由于这两部影片需要有与vstack相同,为hstack相同的高度,您可能需要扩展的其他影片相匹配的另一种:

简单尺度滤波器为例来INPUT 0的宽度设置为640和自动设定高度,同时保持高宽比:

ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
  • 对于更高级的方法,以适应任何大小的视频成特定大小,同时保留长宽比看到重新调整视频的有关ffmpeg以适应静态大小的播放器 。

  • 您还可以使用scale2ref过滤器自动调整一个视频来匹配其他的尺寸。



文章来源: Vertically or horizontally stack several videos using ffmpeg?