Use the vstack https://ffmpeg.org/ffmpeg-filters.html#vstack(垂直的),hstack https://ffmpeg.org/ffmpeg-filters.html#hstack(水平),或xstack https://ffmpeg.org/ffmpeg-filters.html#xstack(自定义布局)过滤器。它比其他方法更容易、更快。
组合/堆叠两个视频或图像
Vertical
使用vstack https://ffmpeg.org/ffmpeg-filters.html#vstack filter.
ffmpeg -i input0 -i input1 -filter_complex vstack=inputs=2 output
视频必须具有相同的宽度。
水平的
使用hstack https://ffmpeg.org/ffmpeg-filters.html#hstack filter.
ffmpeg -i input0 -i input1 -filter_complex hstack=inputs=2 output
视频必须具有相同的高度。
有边框
使用pad https://ffmpeg.org/ffmpeg-filters.html#pad筛选。此示例在两侧之间创建 5 像素的黑色边框。
ffmpeg -i input0 -i input1 -filter_complex "[0]pad=iw+5:color=black[left];[left][1]hstack=inputs=2" output
有音频
缩混并使用原始频道布局
Add the 合并过滤器 https://ffmpeg.org/ffmpeg-filters.html#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
将每个输入的所有音频放入单独的通道
Use amerge https://ffmpeg.org/ffmpeg-filters.html#amerge (or amix https://ffmpeg.org/ffmpeg-filters.html#amix) and pan https://ffmpeg.org/ffmpeg-filters.html#pan过滤器:
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
使用来自某一特定输入的音频
此示例将使用来自的音频input1
:
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 1:a output
添加静音音频/如果一个输入没有音频
如果您混合有音频的输入和没有音频的输入,则合并将失败,因为每个输入都需要音频。您可以使用以下命令添加静音音频空源过滤器 https://ffmpeg.org/ffmpeg-filters.html#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]hstack=inputs=3[v]" -map "[v]" output
如果你想垂直使用 vstack 而不是 hstack。
2x2 grid
Using xstack https://ffmpeg.org/ffmpeg-filters.html#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
Using hstack https://ffmpeg.org/ffmpeg-filters.html#hstack and vstack https://ffmpeg.org/ffmpeg-filters.html#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 效率较低。
带文本的 2x2 网格
使用drawtext https://ffmpeg.org/ffmpeg-filters.html#drawtext filter:
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
4x4
Use the xstack过滤器 https://ffmpeg.org/ffmpeg-filters.html#xstack。总共 16 个视频的示例:
ffmpeg -i input0 -i input1 -i input2 -i input3 -i input4 -i input5 -i input6 -i input7 -i input8 -i input9 -i input10 -i input11 -i input12 -i input13 -i input14 -i input15 -i input16 -filter_complex "[0:v][1:v][2:v][3:v][4:v][5:v][6:v][7:v][8:v][9:v][10:v][11:v][12:v][13:v][14:v][15:v]xstack=inputs=16:layout=0_0|w0_0|w0+w1_0|w0+w1+w2_0|0_h0|w4_h0|w4+w5_h0|w4+w5+w6_h0|0_h0+h4|w8_h0+h4|w8+w9_h0+h4|w8+w9+w10_h0+h4|0_h0+h4+h8|w12_h0+h4+h8|w12+w13_h0+h4+h8|w12+w13+w14_h0+h4+h8" output.mp4
如果您需要先缩放输入:
ffmpeg -i input0 -i input1 -i input2 -i input3 -i input4 -i input5 -i input6 -i input7 -i input8 -i input9 -i input10 -i input11 -i input12 -i input13 -i input14 -i input15 -i input16 -filter_complex "[0:v]scale=iw/4:-1[v0];[1:v]scale=iw/4:-1[v1];[2:v]scale=iw/4:-1[v2];[3:v]scale=iw/4:-1[v3];[4:v]scale=iw/4:-1[v4];[5:v]scale=iw/4:-1[v5];[6:v]scale=iw/4:-1[v6];[7:v]scale=iw/4:-1[v7];[8:v]scale=iw/4:-1[v8];[9:v]scale=iw/4:-1[v9];[10:v]scale=iw/4:-1[v10];[11:v]scale=iw/4:-1[v11];[12:v]scale=iw/4:-1[v12];[13:v]scale=iw/4:-1[v13];[14:v]scale=iw/4:-1[v14];[15:v]scale=iw/4:-1[v15];[v0][v1][v2][v3][v4][v5][v6][v7][v8][v9][v10][v11][v12][v13][v14][v15]xstack=inputs=16:layout=0_0|w0_0|w0+w1_0|w0+w1+w2_0|0_h0|w4_h0|w4+w5_h0|w4+w5+w6_h0|0_h0+h4|w8_h0+h4|w8+w9_h0+h4|w8+w9+w10_h0+h4|0_h0+h4+h8|w12_h0+h4+h8|w12+w13_h0+h4+h8|w12+w13+w14_h0+h4+h8" output.mp4
调整输入大小/缩放
由于两个视频需要具有相同的 vstack 和相同的 hstack 高度,因此您可能需要缩放其他视频之一以匹配另一个视频:
Simple scale https://ffmpeg.org/ffmpeg-filters.html#scale将 input0 的宽度设置为 640 并自动设置高度,同时保留宽高比的过滤器示例:
ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
延迟/暂停视频
此示例将播放左上角的视频,同时暂停其他视频。一旦左上角的视频结束,右上角的视频将播放,依此类推。
Use the tpad https://ffmpeg.org/ffmpeg-filters.html#tpad, adelay https://ffmpeg.org/ffmpeg-filters.html#adelay, xstack https://ffmpeg.org/ffmpeg-filters.html#xstack, and amix https://ffmpeg.org/ffmpeg-filters.html#amix过滤器:
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