FFmpeg脚本逐段解析:三次引入同一输入文件的作用说明
FFmpeg 脚本逻辑全解析
原执行脚本如下:
ffmpeg.exe -t 1 -i "D:\input\3.mp4" -ss 1 -i "D:\input\3.mp4" -i "D:\input\3.mp4" -filter_complex "[1]zoompan=z='if(lte(mod(time,2),1),2,1)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2):s=1920x1070:fps=25/1'[s0];[0][s0]concat=n=2 [outv]" -map [outv] -map 2:a -b:v 500k -s 1920x1070 -c:v h264 -vsync 2 "D:\output\3.mp4" -y
三次引入同一输入文件的原因
FFmpeg 中每个-i参数对应独立的文件解复用上下文,不同上下文的读取指针、截取/跳转参数完全独立,不会互相干扰,三次打开同一个文件(操作系统会自动做文件缓存,不会重复读三次磁盘)是为了分别获取三个用途完全不同的素材流,避免单流反复seek导致的时间戳错乱、性能损耗问题:
- 第1路输入(流编号
0):带-t 1参数,仅读取原视频从0秒开始的前1秒内容,作为无特效的开头拼接段 - 第2路输入(流编号
1):带-ss 1参数,直接快速跳转到原视频第1秒位置开始读取后续内容,专门供zoompan特效滤镜处理 - 第3路输入(流编号
2):不带任何截断/跳转参数,完整读取原视频全量内容,专门用来提取完整音频轨,避免前两路截断导致的音频缺失、时长不匹配问题
逐段执行逻辑注释
把命令按功能拆分后执行顺序如下:
- 读取三路独立的原视频流,分别对应「开头1秒原片」「1秒后待加特效的片段」「完整原片(取音频)」
- 进入滤镜链处理:
- 对第2路流(1秒后开始的片段)施加zoompan推拉特效,处理后的流标记为
s0 - 调用concat拼接滤镜,把第1路的1秒原片、特效处理后的
s0流按顺序拼成完整视频流,标记为outv
- 对第2路流(1秒后开始的片段)施加zoompan推拉特效,处理后的流标记为
- 流映射:把拼接好的
outv视频流、第3路输入的音频流绑定为输出文件的音视频轨 - 编码参数配置:设置视频码率500kbps、固定分辨率1920x1070、H.264编码、音视频同步模式为按时间戳自动补丢帧
- 自动覆盖已存在的输出文件,写出到
D:\output\3.mp4
核心参数与滤镜公式逻辑
zoompan 滤镜参数详解
zoompan是FFmpeg内置的动态推拉缩放滤镜,脚本中各子参数逻辑如下:
z='if(lte(mod(time,2),1),2,1)':动态计算缩放倍率,实现循环推拉效果,逐层拆解计算逻辑:mod(time,2):取当前处理帧在滤镜流内的时间戳对2取模,得到0~2区间的循环值,实现2秒一个效果周期lte(...,1):判断取模结果是否小于等于1,成立返回真,否则返回假if(判断条件,2,1):条件为真时缩放倍率z=2(画面放大2倍),条件为假时z=1(画面原始大小);最终效果是每2秒为一个周期,前1秒保持放大2倍,后1秒缩回原尺寸,循环往复
d=1:设置每输入1帧就输出1帧,不做插帧延长,保持原输入帧率节奏x='iw/2-(iw/zoom/2)'、y='ih/2-(ih/zoom/2)':缩放时的画面左上角坐标计算,保证缩放始终以画面正中心为锚点,不会出现偏移:- 公式中
iw/ih是输入画面的原始宽高,zoom是当前帧计算得到的z轴缩放倍率 - 当画面放大z倍时,实际显示的原始画面区域宽为
iw/z、高为ih/z,要让这个区域居中,左上角x坐标就等于「画面宽度一半」减去「显示区域宽度的一半」,y坐标计算逻辑同理,不管缩放倍率是多少,画面始终保持居中
- 公式中
s=1920x1070:滤镜输出的画面固定为1920x1070分辨率fps=25/1:滤镜输出帧率固定为25fps
其他通用参数
concat=n=2:拼接滤镜配置,指定把2路输入流按先后顺序拼接为一条连续视频流-map 2:a:选择第3路输入的音频流作为输出音频,保证音频完整、长度和原片一致-vsync 2:采用直通式音视频同步策略,帧时间戳直接继承,遇到时间戳不连续时自动补/丢帧,避免音画不同步-y:全局参数,输出文件已存在时直接覆盖,不需要弹出交互确认
内容的提问来源于stack exchange,提问作者Stariy
相关产品推荐
相关产品推荐

