🎬 第二章 把控FFmpeg骨架:【八大金刚】核心开发库
📄 一句话概括

libpostproc 只管解码之后的画面修补:去块、去色斑、临时降噪。 它的活已经被解码器内置滤波与 libavfilter 接走,新项目不必碰它。

📝 本节和前面几节的关系

2.4 讲完编解码,这一篇讲「解完之后顺手修一把」的那个库。 八篇里只有这一篇,本机连库都拿不到。

一、它只做一件事

做什么 用在什么场景


去块效应 低码率 H.264 解码后画面发糊 去色斑 色度采样不足导致的色块 临时降噪 压缩前随手抹一把

它排在解码之后、显示之前,所以名字里有个 post。 这层的定位很尴尬:修得轻了没效果,修得重了细节全丢,而且它只能修「压缩带来的伤」, 修不了「本来就没拍好」。

二、本机为什么没有它

av.library_versions 只报七个库,没有 libpostproc。 原因有两层:一是现代解码器内部自带去块滤波,解码出来的画面已经没有十年前那种大方块; 二是更强的修画质手段都搬到了 libavfilter(nlmeans、hqdn3d 之类)。 所以多数发行版的构建干脆不编它。 你没编它, configure 里那个 --enable-postproc 就只是白写一行。

三、什么时候还会碰上它

只有要复现很老的方案时。 比如十年前的一套监控转码流程,里面写死了 pp=hb/vb 这样的参数。 新项目一律用滤镜:能组合、能看效果、能随时摘掉。postproc 是编进解码流程的开关,开了不好关。 需求 老办法 现在怎么做


去块 postproc 的 pp libavfilter 的 pp 滤镜 降噪 postproc hqdn3d、nlmeans 锐化 做不了 unsharp

「做不了」那一行说明这层的上限:它只修压缩伤,不做创作。而今天的画质处理需求,多半是创作。

四、给这一篇一个位置的理由

教材把它列进八大金刚,是因为历史上它确实是八个之一。 当年的 FFmpeg 里,后处理是独立一层, 跟滤镜并列。 学它的价值不在用它,在认清「库的数量会变」。 libavresample 在 5.0 被删, libpostproc 慢慢没人编,都是同一类事:能力被更合适的层接走,老库就退场。 所以看见老资料写「八大库」,别急着找第八个。 先查自己这套构建里有没有,没有就用新的做法。

五、动手 Demo:libpostproc——名字里带 post 的那个,本机没有

这一段把「本机有几个库」数出来,再看七个里有没有它。 结论不是缺陷,是这个库整体在退场。

import av

print(sorted(av.library_versions))
print("libpostproc" in av.library_versions)

实跑输出:

--------------------------------------------------------------------
libpostproc——名字里带 post 的那个,本机没有
--------------------------------------------------------------------

**① 它只管一件事:解码之后的画面修补**

  做什么       用在什么场景
  --------------------------------------------
  去块效应     低码率 H.264 解码后画面发糊
  去色斑       色度采样不足导致的色块
  临时降噪     压缩前随手抹一把

**② 本机为什么没有**

`av.library_versions` 只报七个库,没有 libpostproc。
因为它的活已经被别人接走了:现代解码器内部就带环路滤波(deblocking),
而更强的修画质方法交给 libavfilter 里的 `pp`、`nlmeans` 这些滤镜。

**③ 什么时候还会用它**

只有要复现很老的方案时。
**新项目一律用 libavfilter 的滤镜**,理由很实际:滤镜链可以组合、可以看效果、可以随时摘掉,
而 postproc 是编进解码流程里的开关,开了不好关。

**④ 一个能直接用的判断**

看见教程写 `--enable-postproc` 配上 `pp=hb/vb` 这类参数,说明那份资料至少有十年了。
**照抄之前先确认自己那版还认不认这个滤镜。**

**本章八篇里,只有这一篇讲的东西本机拿不到。** 把它单列出来,是为了让「八大金刚」这名字齐全,
不是让你去找它。

七个库里没有 libpostproc。 它的活被解码器内置滤波与 libavfilter 接走了。

30 秒实验

  1. python -c "import av; print(sorted(av.library_versions))" 数库名。
  2. 在滤镜表里找 pp 与 hqdn3d,看现在用什么替代它。
  3. 搜一条十年前的转码命令,看里面有没有 pp= 参数。

常见误区

  1. 以为八大金刚必须都装上。 库会退场,libpostproc 就是正在退的那个。
  2. 用它做画质增强。 它只修压缩伤,不做锐化、不做风格化。
  3. 在老命令里留着 pp= 参数。 新构建不认,报 No such filter。
自测三问(点开对答案) 1. libpostproc 排在哪一步之后? —— 解码之后。名字里的 post 就是「后处理」的意思。 2. 本机为什么没有它? —— 现代解码器自带去块滤波,画质修补又都搬到了 libavfilter,多数构建不再编它。 3. 「八大金刚」这个说法要不要死守? —— 不用。库会退场,libavresample 已被删,libpostproc 正在退,按自己构建里有的来。

相关笔记