You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FFmpeg实现动态缩放效果?

如何用FFmpeg实现动态缩放效果?

嘿,我完全懂你想要的效果——在1920x1080的黑色背景上,让中央的视频从半尺寸(960x540)慢慢放大到全屏,对吧?之前试了zoompan、scale、crop都没搞定,尤其是scale没法加时间相关的参数,确实挺闹心的。别担心,咱们用FFmpeg的zoompan结合overlay滤镜就能完美实现,我给你一步步讲清楚:

首先,核心思路是:先生成一个黑色背景,然后对目标视频用zoompan做动态缩放(从0.5倍到1倍),最后把缩放后的视频居中叠加到背景上。

直接上可用的命令,你只需要替换几个参数就行:

-f lavfi -i color=c=black:s=1920x1080:r=30 -i input.mp4 -filter_complex "[1:v]zoompan=z='min(0.5+(t/10)*0.5,1)':d=1:x='(iw-iw*z)/2':y='(ih-ih*z)/2'[scaled];[0:v][scaled]overlay=(W-w)/2:(H-h)/2:shortest=1" -c:v libx264 output.mp4

我给你拆解下每个部分的作用:

  • -f lavfi -i color=c=black:s=1920x1080:r=30:生成一个1920x1080的黑色背景,帧率设为30(你可以改成和你的输入视频一致的帧率,比如25或者60)
  • -i input.mp4:你的目标输入视频(就是那个要居中放大的1920x1080视频)
  • [1:v]zoompan=z='min(0.5+(t/10)*0.5,1)':d=1:x='(iw-iw*z)/2':y='(ih-ih*z)/2'[scaled]:这是实现动态缩放的关键:
    • z='min(0.5+(t/10)*0.5,1)':z是缩放比例,这里设置从0.5(对应960x540)线性增长到1(对应1920x1080)。其中10是你的视频总时长(单位秒),记得换成你实际的视频时长;min是为了防止缩放比例超过1,避免视频变形。
    • d=1:每个帧的持续时间设为1帧,保证缩放过程足够平滑
    • x和y的表达式:让缩放后的视频始终保持在画面中央,不会偏移
  • [0:v][scaled]overlay=(W-w)/2:(H-h)/2:shortest=1:把缩放后的视频叠加到黑色背景上,(W-w)/2:(H-h)/2确保居中,shortest=1表示当输入视频结束时,输出视频也跟着结束

另外给你几个小技巧:

  1. 如果你想要非线性的缩放效果(比如先慢后快,或者先快后慢),可以修改z的表达式,比如用平方函数实现先慢后快:z='0.5 + pow(t/10,2)*0.5'
  2. 先确认你的输入视频时长:可以用ffmpeg -i input.mp4 2>&1 | grep Duration命令查看,比如输出里的00:00:10.00就是10秒
  3. 如果输入视频和背景帧率不一致,建议统一帧率,避免出现卡顿或跳帧

至于你之前遇到的scale滤镜问题,确实scale本身不支持直接随时间变化的参数,虽然可以用sendcmd滤镜配合,但操作起来比zoompan复杂太多,所以用zoompan是最直接高效的方案。

备注:内容来源于stack exchange,提问作者LuvLetter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:49:06