使用 FFMPEG 合并音频和多个视频

使用 FFMPEG 合并音频和多个视频

我正在编写一个 ffmpeg 脚本,将两个视频与一个音频文件合并。第一个视频文件应在大约 6 秒后开始,第二个视频文件应在大约 40 秒后开始,并且两个视频之间应该有一个黑屏填充。但是,它似乎只添加了第一个视频克隆的最后一帧作为填充。

这是我当前的脚本:

ffmpeg -i video_0.mp4 -i video_1.mp4 -i audio.mp4 -filter_complex "[0:v] tpad=start_duration=5927ms:start_mode=add:color=black:stop_mode=add:color=black; [1:v] tpad=start_duration=44901ms:start_mode=add:color=black:stop_mode=add:color=blackconcat=n=2" -map 2:a -f mp4 -movflags +faststart composite_recording.mp4

最终的视频时间应该是:

00:00-00:06 -- 黑屏
00:06-00:24 -- 第一个视频
00:24-00:40 -- 黑屏
00:40-00:48 -- 第二个视频

我尝试为第二个视频的 tpad start_duration 设置不同的值,并希望它在音频播放约 40 秒时开始播放第二个视频,但是它并没有改变任何东西。

答案1

尝试以下命令:

ffmpeg -y -i video_0.mp4 -i video_1.mp4 -i audio.mp4 -filter_complex "[0:v]trim=duration=18,tpad=start_duration=6:start_mode=add:color=black:stop_mode=add:color=black[v0];[1:v] trim=duration=8,tpad=start_duration=16:start_mode=add:color=black:stop_mode=add:color=black[v1];[v0][v1]concat=n=2:v=1:a=0[v]" -shortest -map "[v]" -map 2:a -f mp4 -movflags +faststart composite_recording.mp4


  • [0:v]trim=duration=18- 将 video_0.mp4 修剪为 18 秒(如果视频长度超过 18 秒,则可能需要这样做)。
    同样使用 video_1.mp4 [1:v] trim=duration=8
  • [v0]在过滤器的末尾tpad,将填充的视频存储到临时名称中[v0]
    [v1]在第二个末尾tpad存储到临时名称中[v1]
  • [v0][v1]concat=n=2:v=1:a=0[v]- 连接视频[v0][v1]存储到[v]
  • -shortest- 可选择保持音频和视频之间的最短距离(音频太长时需要)。
  • -map "[v]"映射[v]到输出视频。

为了测试,我们可能会生成合成视频文件(带有计数秒数的计数器):

ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=25 -vcodec libx264 -pix_fmt yuv420p -t 60 video_0.mp4
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=25 -vcodec libx264 -pix_fmt yuv420p -t 60 video_1.mp4
ffmpeg -y -f lavfi -i sine=frequency=300 -acodec aac -ar 22050 -t 500 audio.mp4

相关内容