2. 编码基础重温:宏块与CTU、帧内预测与帧间预测、变换与量化、环路滤波
好,咱们正式开始第二讲。在动手调参之前,我建议先把编码器里最核心的几个概念再过一遍。你可能会说:“这些我都知道啊。” 但相信我,很多参数调优的坑,根源就是对这几个基础模块的理解不够深。
说白了,H.265 相比 H.264 最大的变化,就是把 16x16 的宏块,升级成了最大 64x64 的 CTU。这个变化,直接影响了后面所有的预测、变换和滤波。咱们一个一个来拆。
2.1 从宏块到 CTU:编码树单元的进化
H.264 时代,我们处理的基本单元叫宏块(Macroblock),固定 16x16 像素。到了 H.265,这个单元变成了编码树单元(CTU, Coding Tree Unit)。
CTU 的大小是可变的,最大支持 64x64。你可以把它想象成一棵四叉树:根节点是 64x64,然后可以递归地向下分裂成 32x32、16x16,一直到 8x8。这个分裂过程,就是编码器在“寻找最优划分”。
核心变化: CTU 的引入,让编码器能更灵活地处理不同纹理的区域。平坦区域用大块,细节区域用小块。我个人习惯把 CTU 大小和运动估计的搜索范围联动起来调,效果往往不错。
为什么要有这个变化?你想想看,4K 视频里,一片蓝天可能占了半个屏幕。如果用 16x16 的宏块去编码,需要处理成千上万个块,冗余信息太多。用 64x64 的 CTU,一个块就能搞定,码率自然就降下来了。
下面这张图,展示了 CTU 的四叉树划分结构:
调参小技巧: 在 x265 中,--ctu 参数控制最大 CTU 大小。对于 1080p 以下的分辨率,64 是默认值,效果很好。但如果是 4K 以上,我建议试试 --ctu 32,有时候能减少大块划分带来的振铃效应。
2.2 帧内预测与帧间预测
预测是视频编码的灵魂。说白了,编码器不直接存像素值,而是存“预测值和真实值的差”。这个差越小,码率就越低。
2.2.1 帧内预测:空间上的“猜”
帧内预测,就是利用当前帧里已经编码好的像素,来预测当前块。H.265 支持 35 种帧内预测模式,比 H.264 的 9 种多了不少。
这 35 种模式包括:
- Planar 模式(模式 0): 平滑渐变,适合平坦区域。
- DC 模式(模式 1): 取平均值,适合大面积均匀区域。
- 33 种角度模式(模式 2-34): 覆盖从近水平到近垂直的各种方向。
我记得有一次做屏幕内容编码,发现默认的帧内模式搜索范围太大,导致编码速度很慢。后来我手动限制了 --rect 和 --amp 参数,速度提升明显,画质损失几乎看不出来。
注意: 帧内预测的块大小从 4x4 到 32x32 不等。块越小,预测越精细,但需要传输的模式信息也越多。这是一个典型的“率失真”权衡。
2.2.2 帧间预测:时间上的“抄”
帧间预测更简单粗暴:从已经编码好的参考帧里,找一个最匹配的块,然后只记录两者的位移(运动矢量)和残差。
H.265 引入了 运动合并(Merge)模式 和 高级运动矢量预测(AMVP)。这两个技术,说白了就是让运动矢量传得更省。
| 特性 | H.264 | H.265 |
|---|---|---|
| 运动补偿精度 | 1/4 像素 | 1/4 像素(亮度) / 1/8 像素(色度) |
| 参考帧数量 | 最多 16 个 | 最多 16 个(但实际常用 4-8 个) |
| Merge 模式 | 无 | 有,支持 5 个候选 |
| 预测单元 (PU) 形状 | 对称(16x8, 8x16 等) | 对称 + 非对称(如 16x4, 4x32) |
这里要特别提一下 非对称运动划分(AMP)。在 H.264 里,块划分只能是对半切。H.265 允许 1/4 和 3/4 的切法。比如一个 16x16 的块,可以切成 16x4 和 16x12。这个特性对处理运动物体的边缘特别有用。
2.3 变换与量化
预测做完,我们拿到了残差。残差在空间域里往往还有相关性,所以需要做变换,把能量集中到低频系数上。
H.265 用的是 离散余弦变换(DCT),块大小从 4x4 到 32x32。对于屏幕内容,还引入了 离散正弦变换(DST),用于 4x4 的帧内预测残差。
量化这一步,是编码器里“损失”的主要来源。量化参数(QP)越大,高频系数被丢弃得越多,码率越低,但画质也越差。
关键点: H.265 的变换和量化是结合在一起的。x265 里 --rd 参数控制率失真优化深度。我建议在追求画质时用 --rd 4,追求速度时用 --rd 2。我曾经在一个直播项目中,因为 --rd 设置太高,导致编码延迟超标,后来降到 2 才解决问题。
2.4 环路滤波
环路滤波是编码循环里的最后一步,但它的作用不可小觑。H.265 包含两种滤波器:
- 去块效应滤波器(DBF, Deblocking Filter): 平滑块边界,消除“方块效应”。
- 样本自适应偏移(SAO, Sample Adaptive Offset): 对像素值做精细补偿,减少振铃效应。
SAO 是 H.265 新增的。它把像素分成几类,然后对每一类加一个偏移量。这个偏移量虽然小,但对主观画质的提升很明显。
我个人的经验是,在低码率场景下,SAO 的作用尤其突出。如果你发现画面有“蚊子噪点”,可以试试调整 --sao 参数。默认是开启的,但有时候关闭 SAO 反而能保留更多纹理细节,这取决于你的目标码率。
避坑指南: 我曾经在编码动画片时,发现去块效应滤波太强,导致线条变模糊。后来我把 --deblock 参数从默认的 0:0 改成了 -1:-1,效果好了很多。记住,滤波器的强度不是越大越好。