3、H265编码基础:从CTU到量化,一次讲透

好,咱们进入H265的世界。说实话,当年我从H264转向H265时,第一感觉是「这玩意儿怎么这么复杂」。但跑过几个项目后,我发现它的核心逻辑其实很清晰——用更精细的划分,换更高的压缩率。

今天这一章,我会把H265最关键的几个概念串起来讲。你不需要死记硬背,理解它「为什么这么设计」更重要。

3.1 H265标准概述——它到底强在哪?

H265,也叫HEVC(High Efficiency Video Coding)。名字里就带着「高效」二字。相比H264,它在同等画质下能省下30%~50%的码率。

我个人的经验是:在WebRTC场景里,带宽吃紧的时候,H265的优势特别明显。同样是1Mbps,H264可能已经开始糊了,H265还能保持不错的细节。

核心提升点:

  • 编码单元从16x16扩展到最大64x64
  • 支持更多帧内预测模式(35种 vs H264的9种)
  • 引入SAO(样点自适应补偿)去块效应
  • 并行处理能力更强(Tile、WPP)

但注意,H265不是没有代价。它的编码复杂度大约是H264的2~3倍。我在做移动端适配时,就遇到过低端芯片跑不动H265编码的情况。所以选不选H265,得看你的目标设备。

3.2 CTU/CU/PU划分——从大块到小块

这是H265最核心的变化之一。H264里,宏块大小固定是16x16。H265呢?它引入了CTU(编码树单元),最大可以到64x64。

你想想看,一块平坦的天空,用64x64一个块就能搞定,多省码率。而到了细节丰富的区域,再递归切分成32x32、16x16,甚至8x8。

我的习惯:在WebRTC里,如果画面运动少(比如视频会议),我会倾向于用大CTU(64x64)。如果画面运动剧烈(比如直播游戏),小CTU(32x32或16x16)反而更稳。

CTU往下分,就是CU(编码单元)。CU是真正做预测和变换的基本单位。每个CU可以独立选择帧内或帧间预测。

PU(预测单元)呢?它是在CU基础上,为了做运动补偿而进一步划分的。比如一个32x32的CU做帧间预测,可以拆成两个32x16的PU,分别做运动估计。

我画了张图,帮你理清这个层级关系:

H265 CTU/CU/PU 层级划分示意图 H265 编码单元层级:CTU → CU → PU CTU 64x64 编码树单元 CU 32x32 CU 16x16 CU 16x16 CU 16x16 CU 16x16 PU 划分 PU 16x16 PU 16x16 PU 16x16 PU 16x16 关键理解 • CTU 是顶层单元,最大 64x64,可递归划分 • CU 继承 CTU 的划分,是预测和变换的基本单位 • PU 在 CU 基础上进一步划分,专用于运动补偿

我曾经踩过的坑:在低码率场景下,如果CTU切分太深(比如全是8x8),反而会增加码率。因为每个小块都需要独立的预测信息。所以H265的编码器里,通常有个「率失真优化」来决定切分深度。别自己硬编码固定深度。

3.3 帧内与帧间预测——H265的「猜」术升级了

预测的本质是什么?说白了就是「猜」。用已经编解码的像素,去猜当前块的值。猜得越准,残差越小,码率越低。

帧内预测:35种方向,总有一款适合你

H264只有9种帧内预测模式。H265直接干到了35种——33种角度模式 + DC模式 + Planar模式。

预测模式 数量 说明
Planar 1 平滑渐变,适合平坦区域
DC 1 平均值填充,适合纹理简单区域
角度模式 33 覆盖从近水平到近垂直的各种方向

我在做屏幕共享编码时,发现Planar模式对PPT里的渐变背景特别有效。而角度模式对文字边缘的斜线有奇效。

帧间预测:运动估计更精细了

帧间预测这块,H265最大的变化是——运动矢量精度从H264的1/4像素提升到了1/8像素(亮度分量)。

你可能会问:「1/8像素有意义吗?」有。在低分辨率或慢速运动的场景下,1/8像素的精度能明显减少残差。但代价是计算量暴增。我建议在WebRTC里,如果CPU吃紧,可以限制到1/4像素。

另外,H265还引入了Merge模式和AMVP(高级运动矢量预测)。Merge模式说白了就是「偷懒」——直接用相邻块的运动矢量。对于大面积相同运动的区域(比如背景),能省下不少比特。

实战建议:在WebRTC的H265编码器配置里,我通常会开启Merge模式,但限制最大Merge候选数为2。太多候选反而会引入噪声。

3.4 变换与量化——残差的「压缩」艺术

预测做完,剩下的就是残差了。残差数据通常有空间相关性,变换的作用就是把这些相关性去掉,把能量集中到低频系数上。

变换:从4x4到32x32

H265支持4种变换块大小:4x4、8x8、16x16、32x32。相比H264最大8x8,H265的32x32变换对平坦区域更友好。

我个人的经验是:对于视频会议这种以人脸为主的场景,16x16变换用得最多。而对于屏幕共享(尤其是代码或表格),4x4和8x8更合适,因为文字边缘的高频信息多。

H265用的还是DCT(离散余弦变换),但针对4x4的帧内残差,额外引入了DST(离散正弦变换)。为什么?因为帧内预测的残差在边界处有特殊的分布特性,DST能更好地去相关。

量化:QP的选择是个技术活

量化是编码器里唯一有损的环节。QP(量化参数)越大,细节丢失越多,码率越低。

H265的QP范围是0~51,和H264一样。但同样的QP值,H265的量化步长更精细。所以你在H264里用QP=28,换到H265里可能QP=30就能达到同等画质。

量化矩阵:H265支持自定义量化矩阵。我曾在某个项目中,针对屏幕共享内容定制了高频抑制更强的矩阵,码率降了15%,文字依然清晰。但注意,自定义矩阵需要编码器支持,不是所有WebRTC实现都开放了这个接口。

3.5 本章小结——一张图看懂H265编码流程

最后,我把H265的编码流程串起来,画了张流程图。你对照着看,应该能更清楚每个环节的位置。

H265 编码流程概览 H265 编码核心流程 原始视频帧 CTU 划分 帧内预测 (35种模式) 帧间预测 (运动估计) 残差计算 残差计算 变换 + 量化