我正在编写一个 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