FFmpeg zoompan滤镜运行中偶发重置缩放比例问题求助
解决Zoompan滤镜缩放重置的问题
这个问题我之前也踩过坑!你遇到的缩放突然重置,核心原因是zoompan的d=475参数触发了循环重置机制:当滤镜处理完475帧后,会自动把所有参数(包括zoom的初始值)重置回起点,重新开始计算缩放。而你的图片从主视频22秒才开始叠加,到38秒时,zoompan已经运行了16秒,刚好触达了滤镜内部的循环阈值,导致缩放突然跳回初始尺寸。
问题拆解
你原命令里的几个矛盾点:
zoom+0.0005是基于帧数的递增,但d=475强制滤镜在475帧后循环,一旦帧数达标就重置zoom- 图片流用了
-t 1只截取1秒再循环,导致zoompan的时间线和主视频的叠加时间线错位
修复后的完整命令
ffmpeg -i "output_text2.mp4" -loop 1 -i "1.png" -filter_complex "[1:v]format=yuva422p,scale=1115x1980,setsar=1/1,pad=1.5*iw:1.5*ih:(ow-iw)/2:(oh-ih)/2:color=black@0,trim=start=0:end=19,setpts=PTS-STARTPTS,zoompan=z='1 + 0.0125 * t':s=223x396:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',fade=in:st=0:d=3:alpha=1,fade=out:st=16:d=3:alpha=1[im];[0][im]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:enable='between(t,22,41)':shortest=1" -pix_fmt yuv420p -c:a copy output_0.mp4
关键调整说明
丢掉
-t 1,改用trim控制时长
原命令里-t 1只取1秒图片再循环,容易导致时间线混乱。现在用-loop 1无限循环图片,再通过trim=start=0:end=19截取刚好19秒的片段(对应你需要的图片显示时长),setpts=PTS-STARTPTS重置图片流的时间线为0到19秒,让zoompan的计算更清晰。用时间
t替代帧数计算缩放
把z='zoom+0.0005'改成z='1 + 0.0125 * t':- 原每帧加0.0005,按25fps算每秒就是0.0125,和原缩放速度完全一致
- 基于时间的计算不会受帧数循环影响,缩放会持续平滑递增,再也不会重置
对齐fade和overlay的时间线
- 图片流的时间线重置为0开始,所以
fade=in:st=0:d=3(前3秒淡入),fade=out:st=16:d=3(第16秒开始淡出,对应主视频的22+16=38秒) - overlay添加
enable='between(t,22,41)',确保图片只在主视频的22-41秒之间显示,完美匹配你的需求
- 图片流的时间线重置为0开始,所以
额外优化提示
如果你的视频帧率不是25fps,调整0.0125这个数值即可:比如30fps的话,原每帧加0.0005,每秒就是0.015,所以改成z='1 + 0.015 * t'。要是想调整初始缩放比例,直接修改1这个起始值就行(比如从1.1开始缩放就写1.1 + 0.0125 * t)。
内容的提问来源于stack exchange,提问作者Pier Giorgio Misley
相关产品推荐
相关产品推荐

