ffmpeg - 在窗格中添加多个视频,如何给出偏移开始时间?

ffmpeg - 在窗格中添加多个视频,如何给出偏移开始时间?

在疫情期间,我们的合唱团指挥正在录制一段视频作为伴奏,然后每个合唱团成员(在家)戴着耳机听伴奏,一起唱歌,并把他们的声音和可爱的脸录成视频。我现在想把所有这些不同的视频合并成一个视频,所有成员都放在小窗格中,就像 Brady Bunch 风格一样。当然,每个合唱团成员的硬件都不同,所以音频级别都不同,需要标准化。当然,有一个人把视频拍成了横向的(纵向而不是横向),所以他们的视频在添加进去之前必须先裁剪一下。

我已经基本完成了工作,我的命令行如下所示(简化):

ffmpeg -y -i "Director.MOV"
   -i "Member1.MOV"
   -i "Member2.mp4"
   -filter_complex "
      nullsrc=size=1920x1080 [base];
      [0:v] scale=960x540 [clip0];
      [0:a]volume=1[aud0];
      [1:v] crop=1080:1000:0:920,scale=583x540 [clip1];
      [1:a]volume=2[aud1];
      [2:v] scale=960x540 [clip2];
      [2:a]volume=1.1[aud2];
      [base][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
      [tmp0][clip1] overlay=shortest=1:x=1148:y=0 [tmp1];
      [tmp1][clip2] overlay=shortest=1:x=0:y=540 [tmp2];
      [aud0][aud1][aud2]amix=inputs=3[a]
   " -map "[tmp2]" -map "[a]" -c:v libx264 output.mkv"

效果非常好。

现在来谈谈(希望是最后一个)问题。每个人在不同的时间点击“录制”按钮,因此视频必须经过时移才能合并。

我尝试添加 -itsoffet 如上所述这里,但这当然会偏移视频而不是音频。我尝试在 STARTPTS 之后添加偏移量,如前所述这里,同样,这只会偏移视频。我尝试使用上述的 asetpts 方法偏移音频这里但这似乎没有任何作用。

编辑

[0:v] setpts=PTS-STARTPTS-0.2/TB,scale=960x540 [clip0];
[0:a]volume=1.7066118239302597,asetpts=PTS-STARTPTS-0.2/TB[aud0];
[1:v] setpts=PTS-STARTPTS-3.2/TB,crop=1080:1000:0:920,scale=583x540 [clip1];
[1:a]volume=2.384951956074125,asetpts=PTS-STARTPTS-3.2/TB[aud1];
[2:v] setpts=PTS-STARTPTS,scale=960x540 [clip2];
[2:a]volume=1.1[aud2];

如何使视频的时间向前或向后移动,同时保持音频同步?

我尝试了另一个方向(为稍后开始的视频添加正偏移,而不是为更早开始的视频添加负偏移),只是想看看会发生什么(看看 PTS-STARTPTS 是否不喜欢负数),但结果并没有更好 -

[0:v] setpts=PTS-STARTPTS+3/TB,scale=960x540 [clip0];
[0:a]volume=1.7066118239302597,asetpts=PTS-STARTPTS+3/TB[aud0];
[1:v] setpts=PTS-STARTPTS,crop=1080:1000:0:920,scale=583x540 [clip1];
[1:a]volume=2.384951956074125[aud1];
[2:v] setpts=PTS-STARTPTS+3.2/TB,scale=960x540 [clip2];
[2:a]volume=1.1,asetpts=PTS-STARTPTS+3.2/TB[aud2];
[base][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=1148:y=0 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=0:y=540 [tmp2];
[aud0][aud1][aud2]amix=inputs=3[a]

编辑:ffmpeg-版本报告

ffmpeg version git-2020-08-07-fab00b0 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.1 (GCC) 20200805

看起来相当新。

答案1

itsoffset音频也适用;只是 amix 不尊重绝对时间戳。使用 aresample 以静音填充开头。

我还建议您根据最早的起始视频改变偏移量,以便所有偏移量都是正数。overlay对于延迟的流,必须进行改变以避免在播放开始之前显示冻结的第一帧。

ffmpeg -y -i "Director.MOV"
   -itsoffset 5 -i "Member1.MOV"
   -itsoffset 10 -i "Member2.mp4"
   -filter_complex "
      nullsrc=size=1920x1080 [base];
      [0:v] scale=960x540 [clip0];
      [0:a]volume=1[aud0];
      [1:v] crop=1080:1000:0:920,scale=583x540 [clip1];
      [1:a]volume=2,aresample=async=1:first_pts=0[aud1];
      [2:v] scale=960x540 [clip2];
      [2:a]volume=1.1,aresample=async=1:first_pts=0[aud2];
      [base][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
      [tmp0][clip1] overlay=shortest=1:x=1148:y=0:enable='gt(t\,5)' [tmp1];
      [tmp1][clip2] overlay=shortest=1:x=0:y=540:enable='gt(t\,10) [tmp2];
      [aud0][aud1][aud2]amix=inputs=3[a]
   " -map "[tmp2]" -map "[a]" -c:v libx264 output.mkv"

使用 ffmpeg 4.1 或更高版本。

相关内容