我想将 JPG 图像与 MP4 剪辑连接起来(Windows 10)。图像必须在生成的剪辑的前 5 秒内静默播放,然后播放原始视频。JPG 需要缩放以匹配剪辑分辨率,原始剪辑的帧速率和分辨率必须保持不变。我想在不重新编码视频的情况下完成此操作,因为我有 100 多个剪辑需要处理:
ffmpeg -y -loop 1 -t 5 -i %1.jpg -f lavfi -t 1 -i anullsrc -i %1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" %1-output.mp4
但是,ffmpeg 卡在第 69 帧,没有前进。如果我终止程序,结果将只剩下 5 秒的图像和几帧源音频/视频。我做错了什么?
ps Ffmpeg 是最新版本。
该问题与视频帧速率与循环图像的帧速率不匹配有关(FFmpeg 7.1 中可能也存在错误)。
如果我们不知道帧速率,我们可以使用
tpad
和overlay
过滤器,而不是使用循环和连接:使用 FFmpeg 版本 7.1 我们也可以避免
scale2ref
(scale=rw:rh
而是使用):ffmpeg -y -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[2:v]tpad=start_duration=5[pv];[0:v][2:v]scale=rw:rh[logo];[logo]setsar=sar=1[logo];[pv][logo]overlay=enable=between(t\,0\,5)[outv];[1:a][2:a]concat=n=2:v=0:a=1[outa]" -map "[outv]" -map "[outa]" 1-output.mp4
使用FFmpeg版本5.1.2:
ffmpeg -y -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[2:v]tpad=start_duration=5[pv];[0:v][pv]scale2ref[logo][video];[logo]setsar=sar=1[logo];[video][logo]overlay=enable=between(t\,0\,5)[outv];[1:a][2:a]concat=n=2:v=0:a=1[outa]" -map "[outv]" -map "[outa]" 1-output.mp4
[2:v]tpad=start_duration=5[pv]
- 在视频开头添加黑帧[pv]
(填充具有与输入视频相同的帧速率)。[0:v][2:v]scale=rw:rh[logo];[logo]setsar=sar=1[logo]
- 将徽标图像缩放到视频的大小。[video][logo]overlay=enable=between(t\,0\,5)[outv]
- 在前 5 秒将徽标叠加在视频顶部(仅覆盖填充的帧)。[2:a]concat=n=2:v=0:a=1[outa]
- 将5秒anullsrc
与原始音频连接起来。测试(使用版本 5.1.2):
创建示例输入视频和图像:
ffmpeg -y -f lavfi -i testsrc=s=100x100:r=1:d=1 -frames:v 1 -update 1 1.jpg
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=10 -f lavfi -i sine=frequency=200 -acodec aac -t 30 1.mp4
如果不设置帧率,FFmpeg 就会卡住:
ffmpeg -y -loop 1 -t 5 -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" 1-output.mp4
注意:默认帧速率为 25fps。
设置帧速率时,它与 FFmpeg 5.1.2 一起工作(但坚持使用 FFmpeg 7.1):
ffmpeg -y -loop 1 -framerate 10 -t 5 -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" 1-output.mp4