如何用FFmpeg实现视频从1.0缩放到0.1至单个点?
问题分析与解决方案
原命令的核心错误
- 缩放逻辑完全颠倒:你写的zoom表达式
if(lte(zoom,0.1),1.0,max(1.001,zoom-0.01))会先把画面放大到1.001,之后每次减0.01,降到0.1后立刻重置回1.0,变成循环放大缩小,根本不是持续缩到0.1的效果。 - 帧率与时长冲突:你指定了输出帧率
-r 60,但没统一输入帧率,再加上zoompan的d=1参数,导致原视频帧和输出帧不匹配,出现丢帧或时长异常;-t 3强制截断时长,进一步打乱了帧的正常生成。 - 多余缩放导致拉伸:先
scale=2560:2560再用-s 1280x1280二次缩放,如果原视频不是正方形,必然会拉伸画面。
正确实现方案
方案1:用zoompan实现(推荐)
直接通过线性表达式控制缩放比例,统一帧率后生成目标视频:
ffmpeg -i e:/gals/1/logo_3s.mp4 -vf "fps=60,zoompan=z='1.0 - 0.9*(t/3)':d=1:w=1280:h=1280:x='(iw - iw/zoom)/2':y='(ih - ih/zoom)/2'" -b:v 3000k -t 3 e:/gals/1/loop_z.mp4
fps=60:先把原视频帧率统一到60,避免帧不匹配问题。z='1.0 - 0.9*(t/3)':t是当前时间(秒),3秒时刚好从1.0线性降到0.1,完全符合你的需求。w=1280:h=1280:直接指定输出尺寸,缩放后画面自动居中,周围填充黑背景。x和y的表达式确保缩放后的画面始终居中。
方案2:用scale+pad实现(更直观)
先动态缩放画面,再补黑背景到目标尺寸:
ffmpeg -i e:/gals/1/logo_3s.mp4 -vf "fps=60,scale='iw*(1.0 - 0.9*(t/3))':'ih*(1.0 - 0.9*(t/3))',pad=1280:1280:(ow-iw)/2:(oh-ih)/2" -b:v 3000k -t 3 e:/gals/1/loop_z.mp4
scale的参数用时间表达式控制宽高按比例缩小,保持原画面比例。pad将缩放后的画面居中,补黑背景到1280x1280。
注意事项
- 如果原视频的像素宽高比(SAR)不是1:1,可在
fps滤镜后加setsar=1:1,避免画面变形。 - 若要调整缩放的快慢,修改表达式中的
0.9(总缩放幅度)或t/3中的3(总时长)即可。
内容的提问来源于stack exchange,提问作者Peter.k
相关产品推荐
相关产品推荐

