FFmpeg:合并具有不同开始时间的视频文件

时间:2016-05-18 11:10:31

标签: video ffmpeg

我有两个webm文件,其中包含视频会议的音频和视频录制。这两个文件只包含会话的一面。它们的长度不同(有人在另一个之前加入),但我有每个视频文件开始时间的毫秒时间戳。

在时间轴上,他们看起来像这样:

webm 1:   -----------------------------------------------
webm 2:                 -----------------------------

或者像这样:

webm 1:   -----------------------------------------------
webm 2:                          -----------------------------

我想将这两个视频文件合并为一个文件,以便:

  1. 它们彼此相邻(使用hstack选项)和
  2. 他们和开始时间的时间戳混在一起 考虑到了。最终的视频应如下所示:
  3.   

    目标结果:-------------- =========================== --- -

    新视频的开头和结尾将显示视频文件的黑色占位符,此时此混合流中没有数据。

    目前我使用此命令:

    ffmpeg -i 1463408731413703.webm -i 1463408880317860.webm -filter_complex \
    "[0:v][1:v]hstack=inputs=2[v]; \
     [0:a][1:a]amerge[a]" \
    -map "[v]" -map "[a]" -ac 2  -c:v libvpx output.webm
    

    这会创建一个这样的视频:

      

    效果不佳:===================== ------------------

    即。谈话不同步。

    如何使用ffmpeg组合两个不同长度和不同开始时间的视频流,以便最终得到上面的“目标结果”?

    非常感谢!

2 个答案:

答案 0 :(得分:5)

下面的命令显示了3个输入的情况。第一个输入是最长的并保持在左侧。第二次输入在t = 1秒开始并持续3秒,第三次从t = 4s开始持续2秒。它们显示在右侧。

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex \
       "[0]pad=2*iw:ih[l];[1]setpts=PTS-STARTPTS+1/TB[1v]; [l][1v]overlay=x=W/2[a]; \
        [2]setpts=PTS-STARTPTS+4/TB[2v]; [a][2v]overlay=x=W/2[v]; \
        [1]adelay=1000|1000[1a]; [2]adelay=4000|4000[2a]; [0][1a][2a]amix=inputs=3[a]" \
       -map "[v]" -map "[a]" out.mp4

adelay过滤器用于立体声输入流。

答案 1 :(得分:0)

如果您仍在等待答案,请简单地使用它:

为第二个文件添加了60000毫秒的延迟,为第三个文件添加了120000毫秒的延迟。第一个文件是最长的文件。

ffmpeg -i file_1.mp3 -i file_2.mp3 -i file_3.mp3 -filter_complex
"[1]adelay=60000[file_2];[2]adelay=120000[file_3]; [0][file_2][file_3]amix=3"
output.mp3