1. H.265 编码基础:HEVC 标准概述与核心模块

各位好,我是老周。做流媒体传输这行十几年了,H.265 一直是我工具箱里的核心武器。今天咱们先聊聊它的基础——HEVC 标准到底怎么回事,跟 H.264 比强在哪,以及它的编码框架长什么样。

说实话,我刚接触 H.265 那会儿也觉得它不过是 H.264 的升级版。后来踩了不少坑才明白,这俩的差距远不止压缩率提升那么简单。

1.1 H.265/HEVC 标准概述

HEVC,全称 High Efficiency Video Coding,是 ITU-T 和 ISO/IEC 联合开发的视频编码标准。2013 年正式发布,目标很明确——在同等画质下,码率比 H.264 再砍一半。

为什么能做到?说白了,H.265 在编码工具上做了大量改进。我记得当年第一次用 HM 参考软件压了一段 4K 视频,看到码率只有 H.264 的一半,画质却几乎没差别,当时确实挺震撼的。

核心目标:在相同主观画质下,码率降低 50%;或相同码率下,画质显著提升。

HEVC 主要面向的应用场景包括:

  • 超高清视频:4K/8K 分辨率,这是 H.264 很难高效处理的
  • 高动态范围(HDR):支持更宽的色彩和亮度范围
  • 实时流媒体:低延迟场景下的高效传输
  • 视频会议:带宽受限环境下的高质量通信

1.2 H.265 与 H.264 的对比

很多朋友问我,H.265 到底比 H.264 强在哪?我习惯从几个关键维度来对比:

对比维度 H.264/AVC H.265/HEVC
编码效率 基准 同等画质码率降低 40%~50%
最大块尺寸 16×16(宏块) 64×64(编码树单元 CTU)
帧内预测方向 9 种 35 种
运动补偿精度 1/4 像素 1/4 像素 + 1/8 像素(DCT 插值)
变换块尺寸 4×4 / 8×8 4×4 ~ 32×32
环路滤波 去块滤波 去块滤波 + SAO(样点自适应补偿)
并行处理 Slice 级 Tiles + WPP(波前并行处理)
计算复杂度 较低 编码端约 2~4 倍,解码端约 1.5~2 倍

你看这个表,最直观的区别就是块结构。H.264 用 16×16 的宏块,H.265 直接干到 64×64 的 CTU。你想想看,处理 4K 视频时,大块意味着更少的块数、更少的边信息,压缩效率自然就上去了。

我的经验:在直播场景中,H.265 的编码延迟通常比 H.264 高 20~30ms。如果做低延迟直播,需要仔细调参,否则容易翻车。

1.3 H.265 编码框架与核心模块

H.265 的编码框架,本质上还是混合编码框架——预测 + 变换 + 量化 + 熵编码。但每个模块都做了深度优化。

下面这张图是我自己画的框架图,把核心模块和流程串起来了:

H.265/HEVC 编码框架核心流程 输入视频帧 CTU 分块 (64×64) 帧内预测 (35 方向) 帧间预测 (MV + 参考帧) 残差计算 运动估计/补偿 DCT/DST 变换 量化 + 熵编码 HEVC 码流 去块滤波 + SAO 帧内/帧间预测 → 残差 → 变换 → 量化 → 熵编码 环路滤波用于提升重建质量

框架图看完了,咱们逐个模块拆开聊。

1.3.1 编码树单元(CTU)与四叉树划分

H.265 最核心的变化之一,就是用 CTU 替代了 H.264 的宏块。CTU 最大 64×64,可以递归四叉树划分成更小的 CU(编码单元),最小到 8×8。

为什么要这么设计?我举个例子。你拍一段天空,大片区域纹理简单,用 64×64 的大块就够了;但画面里突然出现一只鸟,纹理复杂,那就把那一块继续往下分。这种自适应划分,比 H.264 固定 16×16 灵活得多。

注意:四叉树深度越深,编码效率越高,但计算量也越大。我曾经在移动端设备上测试过,深度开到 4 层,编码时间直接翻了 3 倍。实际项目中需要根据硬件能力做权衡。

1.3.2 帧内预测

H.265 的帧内预测从 H.264 的 9 种方向扩展到了 35 种——33 个角度方向 + DC 模式 + Planar 模式。

方向多了有什么好处?说白了,能更精细地匹配图像纹理的方向。比如画面里有一根斜着的电线杆,H.264 可能只能选一个接近的角度,H.265 可以选几乎完全匹配的方向,残差自然更小。

我记得有一次做屏幕内容编码,画面里全是细密的文字和线条。H.264 的帧内预测怎么压都压不下去,换成 H.265 的 35 方向预测,码率直接降了 30%。

1.3.3 帧间预测与运动补偿

帧间预测这块,H.265 引入了几个重要改进:

  • Merge 模式:直接从相邻块继承运动矢量,省去编码运动矢量的开销
  • AMVP(高级运动矢量预测):从候选列表中选最优预测矢量
  • 1/8 像素插值:比 H.264 的 1/4 像素更精细,运动估计更准

你想想看,运动补偿精度越高,残差就越小,码率自然就下来了。但代价是计算量——1/8 像素插值需要更多的滤波操作。

1.3.4 变换与量化

H.265 支持 4×4、8×8、16×16、32×32 四种变换块尺寸。大块变换能更好地利用图像的空间相关性,尤其适合平坦区域。

另外,H.265 在 4×4 帧内残差上使用了 DST(离散正弦变换)替代 DCT。为什么?因为帧内预测的残差在边界处往往有能量集中,DST 对这种分布的去相关效果更好。

避坑指南:量化参数(QP)的选择直接影响码率和画质。我习惯在直播场景中用 QP 22~28,VBR 模式下效果比较稳。QP 低于 18 时码率会暴涨,高于 35 时块效应就很明显了。

1.3.5 环路滤波:去块滤波 + SAO

H.265 在去块滤波的基础上,新增了 SAO(样点自适应补偿)。SAO 的作用是对重建像素做分类补偿,减少振铃效应和带状伪影。

说实话,SAO 是 H.265 里被很多人忽略的模块。我在做视频质量评测时发现,开启 SAO 后主观画质提升非常明显,尤其是低码率场景下的平滑区域。但 SAO 会增加解码复杂度,移动端解码器需要特别注意。

1.3.6 熵编码:CABAC

H.265 只用了 CABAC(上下文自适应二进制算术编码),去掉了 H.264 中效率较低的 CAVLC。CABAC 的压缩效率比 CAVLC 高 10%~15%,但计算量也更大。

H.265 的 CABAC 做了优化——上下文模型数量减少了,但编码效率反而提升了。这得益于更合理的上下文建模和概率更新策略。

1.4 并行处理:Tiles 与 WPP

H.265 引入了两种并行处理机制:

  • Tiles:将画面分成矩形区域,每个 Tile 独立编码解码,适合多核并行
  • WPP(波前并行处理):以 CTU 行为单位,每行依赖上一行的第二列开始并行

我个人的建议是,在服务器端编码用 Tiles,在移动端解码用 WPP。Tiles 的边界效应更可控,WPP 的码率损失更小。

关键总结:H.265 的核心优势在于更灵活的块划分、更精细的预测、更大的变换块,以及更高效的熵编码。这些改进让它在同等画质下码率降低 50%,但代价是计算复杂度大幅提升。