gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:38:24 29 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为 on-topic对于堆栈溢出。


1年前关闭。







Improve this question




我有两个完全相同长度的视频,我想使用 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 中
    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
    添加静音音频/如果一个输入没有音频
    如果您混合有音频的输入和没有音频的输入,则 amerge 将失败,因为每个输入都需要音频。您可以使用 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
  • 有关将任何尺寸的视频调整为特定尺寸同时保持纵横比的更高级方法,请参阅 Resizing videos with ffmpeg to fit into static sized player .
  • 您也可以使用 scale2ref过滤器自动调整一个视频的大小以匹配另一个视频的尺寸。

  • 延迟/暂停视频
    此示例将播放左上角的视频,同时暂停其他视频。一旦左上角的视频结束,右上角的视频就会播放,依此类推。
    使用 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/11552565/

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