gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:29:50 25 4
gpt4 key购买 nike

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

我该怎么做?

最佳答案

使用vstack (垂直),hstack (水平),或xstack (自定义布局)过滤器。它比其他方法更容易、更快。

组合/堆叠两个视频或图像

垂直

使用vstack过滤。

enter image description here

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

视频必须具有相同的宽度。

水平

使用hstack过滤。

enter image description here

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

视频必须具有相同的高度。

有边框

使用pad筛选。此示例在两侧之间创建 5px 黑色边框。

enter image description here

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

有音频

缩减混​​音并使用原始 channel 展示位置

enter image description here

添加amerge filter组合两个输入的音频 channel :

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 channel 输出音频流而不是立体声。

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

enter image description here

使用amerge (或 amix )和 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

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

如果您混合有音频的输入和没有音频的输入,则合并将失败,因为每个输入都需要音频。您可以使用 anullsrc filter 添加静音音频为了防止这种情况:

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 个视频或图片

enter image description here

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 网格

enter image description here

使用 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

使用hstackvstack

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 网格

enter image description here

使用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
<小时/>

4x4

使用xstack filter 。总共 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 高度,因此您可能需要缩放其他视频之一以匹配另一个视频:

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

ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
<小时/>

延迟/暂停视频

此示例将播放左上角的视频,同时暂停其他视频。一旦左上角的视频结束,右上角的视频将播放,依此类推。

使用tpad , adelay , xstack ,和 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
  • 此示例假设每个输入的持续时间为 5 秒。根据需要调整 start_durationadelay 值。

  • 此命令需要 FFmpeg 4.3 或更高版本。

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

关于ffmpeg - 使用 ffmpeg 垂直或水平堆叠(马赛克)多个视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22250412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com