一、滤镜基础概念:什么是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

这条命令做了三件事:

  1. crop=640:480:裁剪出画面中央的640x480区域
  2. scale=320:240:缩放到320x240
  3. hflip:水平翻转

数据流是:输入 → 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. [1:v]scale=320:240[pip]:把第二个输入(pip.mp4)缩放到320x240,输出标签命名为 [pip]
  2. [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图,把滤镜、滤镜链、滤镜图的关系画清楚了。我建议你仔细看看,理解数据是怎么流动的。

FFmpeg滤镜体系结构图 FFmpeg 滤镜体系结构 输入源(Input) 单个滤镜(Filter) 输出(Output) 滤镜链(Chain) 逗号分隔 滤镜A 滤镜B 滤镜C 滤镜D 链输出 滤镜图(Filter Graph)—— 支持分支、合并、多输入多输出 输入1 输入2 overlay 输出 滤镜链用逗号串联,滤镜图用分号+标签实现复杂拓扑

1.7 实战中怎么选

我个人的经验是:

  • 只做一个操作:直接用单个滤镜,简单明了
  • 做一系列顺序操作:用滤镜链,逗号一串联到底
  • 需要多路输入或分支:用滤镜图,分号加标签搞定

刚开始学的时候,我建议你先从单个滤镜练起,再尝试滤镜链。滤镜图可以等遇到实际需求时再学,比如做画中画、加水印、视频拼接这些场景。

避坑指南:我曾经在滤镜图里忘记给中间结果打标签,结果FFmpeg报错说找不到输入。记住:每个中间输出都要用 [标签名] 标记,每个输入都要用 [标签名] 引用。少一个方括号,整个图就跑不起来。

好了,第一章的内容就到这里。滤镜、滤镜链、滤镜图这三个概念,是后面所有特效的基础。你只要把输入输出模型搞明白,后面的章节就会轻松很多。