使用FFmpeg制作每5秒切换一张图片的视频遇体积过大等问题求助
使用FFmpeg制作每5秒切换一张图片的视频遇体积过大等问题求助
我来帮你解决这个问题!你遇到的两个问题——图片切换太快和视频体积暴增,其实都是因为FFmpeg参数的用法没搞对,先给你拆解下原因,再给你两个靠谱的解决方案:
为什么之前的命令出问题?
第一个命令(图片切换太快):
你用了-framerate 25,这个参数是告诉FFmpeg每秒读取25个输入帧,但你用glob匹配图片时,FFmpeg默认把每张图片当成一帧,所以8张图总共才8/25≈0.32秒,自然视频超短,每张图只闪一下就过了。第二个命令(体积超大):
你加了-loop 1 -t 5,但这个参数放在glob输入的前面,意味着FFmpeg会对每一张匹配到的图片都无限循环播放,直到满5秒才切换下一张。但-loop 1会让单张图生成大量重复帧,哪怕x264有压缩,这么多冗余帧堆起来,体积自然会爆炸。而且这个参数的用法本来就不适合批量图片的场景。
解决方案一:最简单的批量图片固定时长方案
如果所有图片都要停留5秒,直接用这个命令就行:
ffmpeg -y -framerate 1/5 -pattern_type glob -i '*.jpg' -c:v libx264 -profile:v high -crf 20 -r 25 -pix_fmt yuv420p output.mp4
参数解释:
-framerate 1/5:告诉FFmpeg每5秒读取一张图片(也就是输入帧率是1帧/5秒)-r 25:设置输出视频的帧率为25fps(标准流畅帧率,FFmpeg会自动给单张图片补够25帧/秒的画面,保证视频播放正常)- 其他参数和你原来的一致,
crf 20是合理的压缩质量,不会让体积太大,同时画质也不错
这样生成的视频总时长就是图片数量×5秒,你的8张图就是40秒左右,体积也会正常。
解决方案二:灵活控制单张图片时长(适合不同图片不同时长的场景)
如果之后你想给某几张图片设置不同的停留时间,可以用concat文本文件的方式:
- 先在当前目录创建一个
input.txt文件,内容如下(把你的图片文件名按顺序列出来,每张图后面加duration 5表示停留5秒):
file 'IMG_0670.jpg' duration 5 file 'IMG_0671.jpg' duration 5 file 'IMG_0675.jpg' duration 5 file 'IMG_0680.jpg' duration 5 file 'IMG_0681.jpg' duration 5 file 'IMG_0682.jpg' duration 5 file 'IMG_0684.jpg' duration 5 file 'IMG_0686.jpg' duration 5
- 然后运行FFmpeg命令:
ffmpeg -y -f concat -safe 0 -i input.txt -c:v libx264 -profile:v high -crf 20 -r 25 -pix_fmt yuv420p output.mp4
参数解释:
-f concat:指定使用concat分离器来批量处理文本里的输入内容-safe 0:允许FFmpeg读取当前目录的文件(避免路径权限问题)
这种方法的好处是,你可以随便修改某张图的duration数值,比如把某张改成duration 10,它就会停留10秒,非常灵活。
备注:内容来源于stack exchange,提问作者Daniele Tentoni
相关产品推荐
相关产品推荐

