如何用FFmpeg将图片合成视频并指定单张图片显示时长?
使用FFmpeg为每张图片指定单独时长合成视频
完全可以实现,以下是两种常用方案:
方案1:基于concat解复用器(适合批量图片)
这是处理大量图片的高效方式:
- 创建文本列表文件(比如命名为
image_list.txt),按以下格式编写,每行对应一张图片及其显示时长(单位:秒,100毫秒=0.1秒):
file '1.jpg' duration 0.1 file '2.jpg' duration 0.12 file '3.jpg' duration 0.115
注意:最后一张图片的
duration可以省略,FFmpeg会自动将其时长设为到视频结束的长度。
- 执行FFmpeg命令:
ffmpeg -f concat -safe 0 -i image_list.txt -c:v libx264 -pix_fmt yuv420p output.mp4
参数说明:
-f concat:指定使用concat解复用器读取列表文件-safe 0:允许引用任意路径的文件(如绝对路径)-c:v libx264:采用H.264编码输出视频-pix_fmt yuv420p:确保视频兼容绝大多数播放器
方案2:基于filter_complex手动拼接(适合少量图片)
如果图片数量较少,可直接在命令中逐个定义时长并拼接:
ffmpeg -loop 1 -i 1.jpg -loop 1 -i 2.jpg -loop 1 -i 3.jpg \ -filter_complex \ "[0:v]trim=duration=0.1,setpts=PTS-STARTPTS[v0]; \ [1:v]trim=duration=0.12,setpts=PTS-STARTPTS[v1]; \ [2:v]trim=duration=0.115,setpts=PTS-STARTPTS[v2]; \ [v0][v1][v2]concat=n=3:v=1:a=0[v]" \ -map "[v]" -c:v libx264 -pix_fmt yuv420p output.mp4
参数说明:
-loop 1:让单张图片循环播放,直到被trim截断时长trim=duration=X:截取对应时长的画面片段setpts=PTS-STARTPTS:重置时间戳,避免拼接后出现跳帧问题concat=n=3:v=1:a=0:拼接3个视频流,仅保留视频轨道
额外注意事项
- 确保所有图片分辨率一致,若不一致,可在滤镜链中添加
scale或pad统一尺寸,例如:[0:v]trim=duration=0.1,scale=1920:1080,setpts=PTS-STARTPTS[v0] - 时长需精确转换为秒,例如115毫秒对应0.115秒
- 如需添加音频,可额外指定音频输入文件,或用
anullsrc滤镜生成静音音轨
内容的提问来源于stack exchange,提问作者hanshenrik
相关产品推荐
相关产品推荐

