H.265 HEVC 入门,从 H.264 升级到更高压缩率
前言
如果说 H.264 是现代视频编码最经典的一代标准,那 H.265,也就是 HEVC,可以直接理解成它的全面升级版。
它没有推翻 H.264 的核心世界观,反而是在原有框架上做了一次系统级增强:
- I / P / B 帧还在
- GOP 结构还在
- 帧内预测、帧间预测还在
- 参考帧缓存还在
- NALU 码流组织还在
- IDR 刷新机制还在
所以学习 H.265 最轻松的方法,不是把它当成一门全新的编码标准,而是把它看成:
H.264 的主架构不变,但内部每个关键模块都变得更强了。
这篇文章就按这个思路来讲,不重复你已经理解的 H.264 主线,而是重点讲清楚:
- H.265 相比 H.264 到底升级了什么
- 为什么它能把同等画质下的码率压到更低
- CTU、四叉树、TU、SAO 这些新增机制到底在做什么
- H.265 为什么依然必须缓存历史参考帧
- H.265 最终输出到底是什么
- 编码和解码完整流程怎么串起来
如果只先记一句话,那么可以先记住这个总纲:
H.265 = HEVC = H.264 的增强版。
核心预测思想没有变,真正变化的是块划分更灵活、预测更强、滤波更强、熵编码更统一,因此在相同画质下通常能比 H.264 节省接近一半码率。
一、为什么已经有 H.264 了,还要再来一个 H.265
H.264 在很长时间里都非常成功,但它也有明显瓶颈,尤其是在分辨率和带宽压力不断提升之后。
最典型的问题是:
- 1080p 时代够用,但到了 4K、8K,码率压力迅速变大
- 固定宏块思路不够灵活,大面积平坦区域压缩效率不够高
- 复杂运动场景下,预测精度还可以继续提升
- 后处理和环路优化能力不够强
如果把 H.264 的痛点压缩成一句话,就是:
它的基本压缩思路没问题,但很多关键模块已经不够适合更高分辨率和更苛刻的带宽场景。
H.265 就是在这个背景下诞生的。它最核心的目标非常直接:
- 在相近画质下,进一步降低码率
- 在有限带宽下,支持更高分辨率视频
- 提高压缩效率,尤其是 4K / 8K 场景下的效率
所以你会看到 H.265 的一切改动,几乎都围绕一个关键词展开:
更高压缩效率。
二、先抓住本质,H.265 和 H.264 到底什么关系
从主线看,H.265 和 H.264 的编码框架其实高度相似。
flowchart LR
A[Raw frame] --> B[Split into blocks]
B --> C[Choose frame type]
C --> D[Intra or inter prediction]
D --> E[Residual]
E --> F[Transform and quant]
F --> G[Entropy coding]
G --> H[NALU bitstream]
这条主线没有变。真正变化的是每个环节都比 H.264 做得更激进:
- 块划分从固定宏块升级成更灵活的树状划分
- 帧内预测方向大幅增加
- 帧间预测能力更强
- 变换单元尺寸更灵活
- 环路滤波多了一层 SAO
- 熵编码统一走 CABAC
- 参数集多了 VPS
所以理解 H.265 时,最稳的方式就是:
不要把它当成另一套完全不同的世界,而要把它看成对 H.264 各模块的逐项升级。
三、H.265 最大的结构变化,不再是固定 16×16 宏块,而是 CTU
这是 H.265 最重要、也最常被问到的点。
H.264 里大家最熟悉的是 16×16 宏块 MB。这个设计在当年很经典,但问题也明显,它的粒度相对固定,不够灵活。
H.265 直接把这个入口换掉了,改成了 CTU,Coding Tree Unit,编码树单元。
CTU 最大可以到 64×64,并且可以继续递归拆分。
flowchart TD
A[CTU 64x64] --> B[32x32]
B --> C[16x16]
C --> D[8x8]
D --> E[4x4]
这件事为什么重要?因为它让编码器第一次可以对不同区域采用完全不同的块粒度。
1. 平坦区域可以用大块
如果画面某个区域变化很小,比如:
- 蓝天
- 墙面
- 背景虚化区域
- 大面积静止场景
那么用 64×64 这样的大块编码会非常划算,因为这个区域内部本来就很一致,没有必要拆得太碎。
2. 边缘和细节区域可以继续拆小
如果画面里出现这些情况:
- 文字边缘
- 人脸轮廓
- 复杂纹理
- 快速运动物体
那就继续往下拆,把复杂区域拆成更小的块,这样预测和残差表达都会更精准。
3. 这就是 H.265 压缩率提升的起点
H.265 能明显省码率,第一推动力就是这件事:
用大块吃掉平坦区域,用小块精确描述复杂区域。
H.264 也能分块,但 H.265 在块划分上的自由度明显更高,因此它对不同图像区域的适应能力更强。
四、从 CTU 往下,还要理解 CU、PU、TU
H.265 里块结构比 H.264 更细,所以你会经常看到几个名字:
- CTU
- CU
- PU
- TU
第一次看会觉得复杂,但其实可以直接按职责理解。
| 名称 | 作用 | 直觉理解 |
|---|---|---|
| CTU | 最大入口块 | 整个树状划分的起点 |
| CU | 编码决策单元 | 这个区域怎么编码 |
| PU | 预测单元 | 这个区域怎么做预测 |
| TU | 变换单元 | 这个区域怎么做变换和量化 |
它们不是四套互相独立的世界,而是同一块区域在不同处理阶段的视角。
可以用下面这张图快速记住。
flowchart TD
A[CTU] --> B[CU split]
B --> C[PU choose prediction]
B --> D[TU choose transform]
也就是说:
- CTU 负责给出一个大入口
- CU 决定这一块怎么划分和编码
- PU 负责预测相关的划分与模式
- TU 负责残差变换和量化时的块结构
这比 H.264 的宏块思路更复杂,但也正因为这种复杂度,H.265 能把预测、变换、残差压缩做得更细。
五、H.265 为什么比 H.264 更省码率,核心升级点到底有哪些
下面这张对比表最适合建立整体印象。
| 模块 | H.264 | H.265 HEVC |
|---|---|---|
| 基本单元 | 16×16 宏块 MB | 最大 64×64 CTU,树状递归划分 |
| 帧内预测 | 方向更少 | 方向更多,预测更细 |
| 帧间预测 | 较成熟 | 参考管理和候选模式更强 |
| 变换单元 | 尺寸相对有限 | 4 / 8 / 16 / 32 更灵活 |
| 环路处理 | Deblock | Deblock + SAO |
| 熵编码 | CAVLC 或 CABAC | 实际主流统一走 CABAC |
| 参数集 | SPS + PPS | VPS + SPS + PPS |
| 压缩效率 | 高 | 更高,常见可节省接近一半码率 |
下面逐项拆开讲。
1. 帧内预测方向更多
H.264 已经有不错的帧内预测,但 H.265 进一步增加了方向模式。直觉上就是:
它更擅长顺着图像边缘、纹理走向去猜当前块。
预测越准,残差越小,后面的变换和量化就越容易压。
2. 帧间预测更强
H.265 仍然保留运动估计和运动补偿这条主线,但它在候选模式、参考管理、运动向量继承等方面都更强。
从结果上看,你可以把它理解成:
- 更容易找到更好的参考块
- 更容易复用周围块的运动信息
- 在复杂运动场景下更不容易浪费码率
3. 变换单元更灵活
H.264 的变换已经很成熟,但 H.265 在 TU 尺寸上更灵活,能更适配不同类型的残差分布。
这意味着:
- 平滑区域可以更大尺度地处理
- 细节区域可以更小尺度地保留信息
4. 多了一层 SAO
H.264 常讲去块滤波 Deblocking,而 H.265 在这之后又补了一层 SAO,Sample Adaptive Offset。
SAO 的作用不是替代去块,而是进一步修正重建样本,使边缘和局部失真表现更自然。
可以简单记成:
- Deblock 主要处理块边界感
- SAO 主要进一步修正重建样本分布
这也是 H.265 看起来画质更“干净”的原因之一。
5. 熵编码更加统一
H.264 里常会讲 CAVLC 和 CABAC 两条线,而在 H.265 里,主流理解就是 CABAC 成为核心方案。
CABAC 更复杂,但压缩效率更高,所以它符合 H.265 的整体设计哲学:
用更高复杂度,换更低码率。
六、一帧图像输入 H.265 后,完整编码流程是什么
如果你已经理解 H.264,那么看 H.265 的完整编码流程会非常顺。
flowchart LR
A[Raw YUV frame] --> B[CTU split with tree]
B --> C[Frame type choose]
C -->|I| D[Intra prediction]
C -->|P B| E[Inter prediction with refs]
D --> F[Pred block]
E --> F[Pred block]
F --> G[Residual]
G --> H[Transform by TU]
H --> I[Quant]
I --> J[Scan]
J --> K[CABAC]
K --> L[VPS SPS PPS and slices]
L --> M[HEVC bitstream]
1. 输入仍然是原始视频帧
和 H.264 一样,输入不是 JPG、PNG,也不是 MP4,而是一帧未压缩的原始图像,常见仍然是 YUV420。
2. 先按 CTU 入口进行树状划分
编码器先从较大的 CTU 入手,然后根据区域复杂度决定是否继续拆分。
3. 决定当前帧类型
- I 帧只做帧内预测
- P 帧参考过去参考帧
- B 帧可参考前后参考图像
- IDR 负责重启参考链
4. 做预测
这一层和 H.264 主线一致,只不过预测工具更强,块划分更灵活。
5. 计算残差
仍然是:
原始块 - 预测块 = 残差块
6. 对残差做变换和量化
这里 H.265 会结合更灵活的 TU 结构进行处理,让不同区域用更适合自己的变换粒度。
7. 用 CABAC 熵编码
把前面产生的语法元素压成更紧凑的二进制数据。
8. 打包成 H.265 码流
最后组织成 VPS、SPS、PPS、Slice 等 NAL 单元,输出 HEVC 比特流。
七、H.265 最终输出到底是什么
这个问题和 H.264 完全对应。
H.265 输出的不是图片,也不是 MP4 文件,而是:
H.265 / HEVC 编码后的二进制比特流。
其中常见的 NAL 单元包括:
- VPS
- SPS
- PPS
- IDR / I / P / B 对应的切片数据
- SEI 等补充信息
flowchart LR
A[HEVC stream] --> B[VPS]
A --> C[SPS]
A --> D[PPS]
A --> E[IDR or I slice]
A --> F[P slice]
A --> G[B slice]
A --> H[SEI]
这里和 H.264 的一个直观区别就是:
H.265 多了 VPS,Video Parameter Set。
所以如果你在面试里被问到 H.264 和 H.265 的参数集区别,一个很稳的回答就是:
- H.264 常见参数集是 SPS、PPS
- H.265 常见参数集是 VPS、SPS、PPS
同样也要强调一点:
这些码流里并没有“完整图片”这个概念,只有参数、预测信息、运动信息、残差信息和语法元素。必须经过解码器,才能重建出图像帧。
八、H.265 为什么依然必须缓存参考帧
这个问题和 H.264 一样重要,而且答案几乎一样:
必须缓存,编码器和解码器两边都必须缓存。
因为 P 帧和 B 帧的本质没有变,它们还是建立在参考图像之上的。
1. I 帧编码后也要进缓存
I 帧虽然不依赖别的参考帧,但它自己重建完成之后,往往会进入参考帧列表,供后续 P/B 帧使用。
2. P 帧必须读取历史参考帧
P 帧的核心就是“拿过去的一张或几张参考图来预测现在”。如果没有参考帧缓存,就不存在运动估计和运动补偿。
3. B 帧会进一步增加缓存和时序复杂度
B 帧既可能参考前向,也可能参考后向参考图像,因此会让:
- 参考管理更复杂
- 编码顺序和显示顺序更容易分离
- 延迟更高
4. H.265 一般能管理更多参考信息
和 H.264 相比,H.265 在参考管理上更强,因此实际工程里经常会看到它对参考图像利用得更充分。
但核心原则完全没变:
没有参考缓存,就没有 P/B 帧。
九、缓存里存的依然不是原始帧,而是重建帧
这是视频编码里一个非常关键的统一原则,在 H.265 里依然成立。
缓存里保存的不是原始输入帧,而是重建帧。
原因和 H.264 一样:
- 编码器后续预测时看到的参考图像
- 解码器后续预测时看到的参考图像
必须一致。
如果编码器用原始图作参考,而解码器只能用重建图作参考,那么两边后续预测就会逐渐漂移,最后画面无法严格一致。
所以 H.265 编码器内部也会有一条本地重建路径。
flowchart TD
A[Original frame] --> B[Prediction]
B --> C[Residual]
C --> D[Transform and quant]
D --> E[CABAC bitstream]
D --> F[Inverse quant and inverse transform]
F --> G[Add prediction]
G --> H[Reconstructed frame]
H --> I[Reference buffer]
这张图对应的工程理解是:
- 编码器一边在输出码流
- 一边在本地重建参考帧
- 后续帧预测都基于重建帧
这就是编码器和解码器能长期保持一致的基础。
十、IDR 在 H.265 里依然是参考链的重启点
H.265 没有取消这个核心机制。
IDR 的意义仍然可以概括成:
- 从这里开始可以重新建立参考链
- 后续画面不再依赖这个点之前的参考图像
- 解码器可以丢弃旧参考缓存
- 丢包或错误传播可以在这里被截断
所以不管是 H.264 还是 H.265,IDR 都可以理解成一个非常重要的随机访问和状态重置点。
十一、H.265 解码流程,本质上还是编码的逆过程
解码流程和 H.264 非常接近,只不过对应的是 H.265 的语法和工具集。
flowchart LR
A[HEVC bitstream] --> B[Parse VPS SPS PPS NALU]
B --> C[CABAC decode]
C --> D[Inverse quant]
D --> E[Inverse transform]
E --> F[Residual]
F --> G[Intra or inter reconstruct]
G --> H[Deblock and SAO]
H --> I[Output YUV frame]
I --> J[Reference buffer]
它的主线可以压缩成这几步:
- 解析 VPS、SPS、PPS 和 Slice
- 做 CABAC 熵解码
- 反量化、反变换,恢复残差
- 结合帧内预测或运动补偿重建图像
- 做 Deblock 和 SAO
- 输出重建帧,并写入参考缓存
十二、H.264 和 H.265 最该怎么对比着记
如果要快速建立记忆,最稳的方式是分成“相同点”和“升级点”。
1. 相同点
两者共有的主干逻辑包括:
- 都有 I / P / B 帧
- 都有 GOP 和 IDR
- 都有帧内预测、帧间预测
- 都要编码残差
- 都需要变换、量化、熵编码
- 都输出 NALU 组织的比特流
- 都依赖参考帧缓存
- 都缓存重建帧而不是原始帧
2. 升级点
H.265 相比 H.264 的升级重点主要是:
- 块划分更灵活,CTU 替代固定宏块
- 预测能力更强,特别是帧内方向更多
- 变换单元更灵活
- 环路滤波更强,增加 SAO
- 参数集更完整,多了 VPS
- 压缩效率更高,但复杂度也更高
3. 一句话记忆版
H.264 像是成熟稳定的通用方案,H.265 则是在相同主干下,把每个核心模块都强化了一轮,用更高复杂度换来更低码率。
十三、H.265 的优缺点和实际应用
1. 优点
H.265 最明显的优点就是压缩效率高。
在相近主观画质下,它通常能比 H.264 节省大量码率,因此特别适合:
- 4K / 8K 视频
- 带宽敏感的超清点播
- 码率压力大的监控存储
- 对容量敏感的高分辨率视频归档
2. 缺点
代价也很明显:
- 编码复杂度更高
- 解码压力更大
- 硬件兼容性要求更高
- 部分场景下延迟控制更麻烦
- 历史上专利和授权成本问题更复杂
3. 典型应用场景
现在比较典型的应用包括:
- 4K 流媒体平台
- 高清监控录像
- 车载高分辨率视频系统
- UHD 蓝光和高码率点播
- 对存储空间特别敏感的视频业务
不过在极致兼容性或极致低延迟场景里,H.264 仍然非常常见。这也说明:
H.265 不是完全替代 H.264,而是在更高压缩效率场景下优势更明显。
十四、最后把 H.265 真正串成一句话
如果要把这篇文章压缩成一句完整描述,那么可以这样说:
H.265 延续了 H.264 以预测为核心、以残差压缩为主线、以参考帧缓存为基础的编码框架,但通过 CTU 树状划分、更强预测、更灵活变换、更强环路滤波和更统一的熵编码,在相同画质下显著降低了码率。
所以理解 H.265 的关键,不是忘掉 H.264,而是站在 H.264 之上继续往前走。
附,一张总览图
flowchart TD
A[Raw YUV frame] --> B[CTU tree split]
B --> C[Frame type]
C --> D[Intra pred]
C --> E[Inter pred]
D --> F[Residual]
E --> F[Residual]
F --> G[Transform by TU]
G --> H[Quant]
H --> I[CABAC]
I --> J[HEVC bitstream]
H --> K[Inverse quant]
K --> L[Inverse transform]
L --> M[Reconstruct frame]
M --> N[Deblock and SAO]
N --> O[Reference buffer]
这张图值得和 H.264 的总览图对着看。
你会发现两者主线非常像,但 H.265 在块划分、变换、滤波和参考利用上都更激进,这也是它压缩效率更高的根本原因。