如何用FFmpeg创建大时长图片幻灯片视频,控制大小并解决相关异常?
解决FFmpeg制作长时长图片幻灯片的问题
问题根源
你用concat分离器加duration参数的方式,本质是让FFmpeg重复单张图片的帧来凑时长,这就触发了重复帧警告;而且编码器(比如x264)会自动优化掉大量重复帧,导致输出视频只有几帧,没法达到3小时的时长。decimate/mpdecimate是用来删除重复帧的,用在这里完全反了方向,当然没用。
两种可行解决方案
方案一:用loop+滤镜拼接(推荐)
直接让每张图片循环播放指定时长,再通过滤镜拼接成完整视频,这样FFmpeg会生成对应时长的帧,不会被编码器过度优化:
ffmpeg -loop 1 -t 3600 -i img1.jpg -loop 1 -t 3600 -i img2.jpg -loop 1 -t 3600 -i img3.jpg \ -filter_complex "[0:v][1:v][2:v]concat=n=3:v=1:a=0" -c:v libx264 -crf 18 -preset medium output.mp4 -y
-loop 1:让单张图片循环播放-t 3600:指定每张图片播放1小时concat滤镜:把三个单时长片段拼接成一个视频-crf 18:控制视频质量(数值越小质量越高,18-23是肉眼无损区间),preset medium:平衡压缩速度和文件大小,这样生成的视频文件大小会接近三张图片编码后的总大小,符合你的需求。
方案二:修正concat文件用法
如果你坚持用inputs.txt,需要强制指定帧率,让FFmpeg生成足够多的帧来填满时长,避免编码器优化:
ffmpeg -f concat -r 25 -i inputs.txt -c:v libx264 -crf 18 -preset medium -vf "fps=25" output.mp4 -y
-r 25:设置输入帧率为25帧/秒,这样每张图片会生成3600*25=90000帧,而非重复单帧-vf "fps=25":确保输出帧率和输入一致,避免帧丢失
补充说明
用x264编码时,重复帧会被高效压缩,所以最终文件大小不会像“25帧/秒×3小时”那么夸张,会接近三张图片本身的编码大小总和,完全符合你“文件大小接近图片总大小”的要求。
内容的提问来源于stack exchange,提问作者Stefan Falk
相关产品推荐
相关产品推荐

