一、滤镜基础概念:什么是FFmpeg滤镜、滤镜链与滤镜图
各位同学好,我是你们这门课的老朋友。今天咱们正式进入《FFmpeg滤镜与特效实战》的第一章。
说实话,我最早接触FFmpeg滤镜时,也被那一堆参数搞得有点懵。但后来我发现,只要把三个核心概念搞明白——滤镜、滤镜链、滤镜图——剩下的就是组合游戏了。
1.1 什么是FFmpeg滤镜
滤镜,英文叫 filter,说白了就是一个音视频处理单元。你给它输入一段视频或音频,它按照你指定的规则处理一遍,然后输出结果。
举个例子:
ffmpeg -i input.mp4 -vf "hflip" output.mp4
这条命令里的 hflip 就是一个滤镜。它的工作就是:把每一帧画面水平翻转。输入是正常的画面,输出是镜像画面。
我在项目中遇到过最典型的场景:客户给了一段竖屏拍的视频,要求转成横屏。直接拉伸会变形,怎么办?我用了 crop 滤镜先裁剪,再用 scale 滤镜缩放,最后用 pad 滤镜补黑边。三个滤镜串起来,问题就解决了。
核心要点:FFmpeg滤镜遵循严格的输入→处理→输出模型。每个滤镜只做一件事,但组合起来能完成复杂特效。
1.2 滤镜的输入输出模型
每个滤镜都有输入引脚(input pads)和输出引脚(output pads)。你可以把它想象成一个带接口的黑盒子:
- 输入引脚:接收视频帧或音频采样数据
- 输出引脚:送出处理后的数据
- 参数:控制滤镜行为(比如缩放尺寸、翻转方向)
大多数滤镜只有一个输入和一个输出,但有些特殊滤镜有多个。比如 overlay 滤镜有两个输入(主画面和叠加画面),一个输出(合成后的画面)。
小技巧:用 ffmpeg -filters 可以查看所有内置滤镜。用 ffmpeg -filter=filter_name -help 查看某个滤镜的详细参数。我调试时经常用这两个命令。
1.3 滤镜链:把滤镜串起来
单个滤镜能做的事有限。实际工作中,我们经常需要把多个滤镜串联起来,前一个的输出作为后一个的输入。这就是滤镜链(filter chain)。
语法很简单,用逗号 , 分隔:
ffmpeg -i input.mp4 -vf "crop=640:480,scale=320:240,hflip" output.mp4
这条命令做了三件事:
crop=640:480:裁剪出画面中央的640x480区域scale=320:240:缩放到320x240hflip:水平翻转
数据流是:输入 → crop → scale → hflip → 输出。每一步的输出自动成为下一步的输入。
注意:滤镜链中的顺序很重要!先裁剪再缩放,和先缩放再裁剪,结果完全不同。我曾经因为搞反顺序,把客户的人脸裁掉了一半……嗯,从那以后我再也不敢乱排顺序了。
1.4 滤镜图:更复杂的组合
滤镜链只能处理线性的流程。但有些场景需要分支或合并。比如:
- 把两个视频拼在一起(画中画)
- 给视频加水印(叠加图片)
- 同时处理视频和音频
这时候就需要滤镜图(filter graph)。它用分号 ; 分隔不同的链,用方括号 [] 标记输入输出标签。
看个实际例子——画中画效果:
ffmpeg -i main.mp4 -i pip.mp4 -filter_complex \
"[1:v]scale=320:240[pip]; \
[0:v][pip]overlay=10:10" \
output.mp4
解释一下:
[1:v]scale=320:240[pip]:把第二个输入(pip.mp4)缩放到320x240,输出标签命名为[pip][0:v][pip]overlay=10:10:把主画面(第一个输入)和缩放后的画中画叠加,位置在左上角(10,10)
数据流是这样的:
main.mp4 ──→ [0:v] ──┐
├──→ overlay ──→ output.mp4
pip.mp4 ──→ [1:v] ──→ scale ──→ [pip] ──┘
你看,这里出现了分支和合并,这就是滤镜图比滤镜链强大的地方。
1.5 核心概念对比
| 概念 | 分隔符 | 数据流 | 适用场景 |
|---|---|---|---|
| 滤镜 | 无 | 单个处理单元 | 单一操作(翻转、缩放、裁剪) |
| 滤镜链 | 逗号 , |
线性串联 | 顺序处理(先裁再缩再翻转) |
| 滤镜图 | 分号 ; + 标签 [] |
分支/合并/多输入 | 画中画、水印、多路合成 |
1.6 一张图看懂整体结构
下面这张SVG图,把滤镜、滤镜链、滤镜图的关系画清楚了。我建议你仔细看看,理解数据是怎么流动的。
1.7 实战中怎么选
我个人的经验是:
- 只做一个操作:直接用单个滤镜,简单明了
- 做一系列顺序操作:用滤镜链,逗号一串联到底
- 需要多路输入或分支:用滤镜图,分号加标签搞定
刚开始学的时候,我建议你先从单个滤镜练起,再尝试滤镜链。滤镜图可以等遇到实际需求时再学,比如做画中画、加水印、视频拼接这些场景。
避坑指南:我曾经在滤镜图里忘记给中间结果打标签,结果FFmpeg报错说找不到输入。记住:每个中间输出都要用 [标签名] 标记,每个输入都要用 [标签名] 引用。少一个方括号,整个图就跑不起来。
好了,第一章的内容就到这里。滤镜、滤镜链、滤镜图这三个概念,是后面所有特效的基础。你只要把输入输出模型搞明白,后面的章节就会轻松很多。