1. H.265编码标准概述:HEVC发展历程、与H.264对比、编码框架与核心模块
各位同学好,我是老张。今天咱们正式开讲H.265/HEVC。说实话,这个标准我接触了快十年,从它还是草案阶段就开始跟进。记得2012年我刚拿到HEVC测试模型时,第一反应是——这玩意儿复杂度也太高了吧?但后来在实际项目中尝到了甜头,才明白这些复杂度换来的压缩收益有多值。
1.1 HEVC的发展历程
HEVC的全称是High Efficiency Video Coding,高效视频编码。它由ITU-T VCEG和ISO/IEC MPEG联合开发,也就是咱们常说的JCT-VC团队。
几个关键时间节点:
- 2010年:JCT-VC正式成立,开始征集提案。我记得当时收到了超过200份技术提案,竞争相当激烈。
- 2013年1月:HEVC正式成为国际标准,编号ITU-T H.265 | ISO/IEC 23008-2。
- 2014年:第一版商用编码器问世,但说实话,那时候的编码速度慢得让人抓狂。
- 2016年:HEVC的扩展版本发布,支持了更多应用场景,比如屏幕内容编码和3D视频。
核心观点:HEVC的诞生不是偶然的。H.264在2003年标准化后,视频分辨率从标清一路飙到4K、8K,H.264的压缩效率已经捉襟见肘。HEVC的目标很明确——在相同画质下,码率再降一半。
1.2 HEVC与H.264的对比
很多同学问我:H.265到底比H.264强在哪?我一般会从三个维度来回答。
| 对比维度 | H.264/AVC | H.265/HEVC | 我的实际感受 |
|---|---|---|---|
| 压缩效率 | 基准 | 平均提升40%~50% | 项目中实测1080p视频,码率从8Mbps降到4Mbps,画质几乎看不出差异 |
| 编码单元 | 16×16宏块 | 64×64 CTU,支持四叉树划分 | 这个改动是压缩率提升的核心,后面会细讲 |
| 帧内预测 | 9种方向 | 35种方向 | 纹理复杂区域效果明显,尤其是斜纹和渐变 |
| 帧间预测 | 1/4像素精度,最多16个参考帧 | 1/4像素精度,高级运动矢量预测,最多16个参考帧 | 运动场景的码率节省非常可观 |
| 变换 | 4×4、8×8 DCT | 4×4~32×32 DCT + DST | 大尺寸变换对平坦区域特别友好 |
| 环路滤波 | 去块效应滤波 | 去块效应滤波 + SAO | SAO这个工具,我一开始觉得鸡肋,后来发现对主观画质提升很大 |
| 并行处理 | 有限支持 | Tile、WPP、Slice | 多核CPU上编码速度能翻倍,这个设计很聪明 |
避坑指南:我曾经在一个项目中,为了追求极致压缩率,把所有HEVC工具都开到最大。结果编码速度慢到无法接受,而且解码端也跑不动。后来我学乖了——压缩率、编码速度、解码复杂度,这三者永远需要权衡。没有银弹。
1.3 HEVC编码框架
HEVC的编码框架,说白了还是混合编码框架。它和H.264的框架结构很像,但每个模块都做了深度优化。
下面这张图是我自己画的,把HEVC的核心流程串起来了。你仔细看,会发现它其实是一个带反馈的环路结构。
嗯,这张图信息量不小。我带你走一遍:
- 输入帧先被划分成CTU(编码树单元),最大64×64。
- 每个CTU通过四叉树递归划分,决定最优的编码单元大小。
- 然后进入预测模块——帧内预测用35种方向,帧间预测用高级运动矢量预测。
- 原始块减去预测块得到残差。
- 残差经过DCT/DST变换和量化,变成系数。
- 系数通过CABAC熵编码输出码流。
- 同时,量化后的系数要经过反量化、反变换,加上预测值得到重建帧。
- 重建帧经过去块效应滤波和SAO,存入参考帧列表,供后续帧的预测使用。
注意:这个环路反馈机制是混合编码框架的精髓。我曾经见过有新手工程师为了省事,在编码器里跳过了重建环路,结果解码端画面全是漂移。记住——编码器里的重建环路必须和解码器完全一致,否则码流不兼容。
1.4 核心模块详解
1.4.1 CTU与四叉树划分
HEVC最大的创新之一,就是用CTU替代了H.264的宏块。CTU最大64×64,可以递归划分成更小的CU(编码单元)。
为什么会这样设计?你想想看,4K视频里,大片天空或墙壁都是平坦区域,用64×64的大块编码,一个块就能搞定。而H.264的16×16宏块,同样的区域要编16个块,码率自然就上去了。
划分决策的伪代码大概长这样:
// 四叉树划分决策(简化版)
function decidePartition(ctu, depth):
if depth == maxDepth:
return encodeCU(ctu)
// 计算不划分的RD代价
costNoSplit = encodeCU(ctu)
// 尝试划分成4个子块
costSplit = 0
for each subCU in split(ctu):
costSplit += decidePartition(subCU, depth+1)
// 选择代价小的方案
if costNoSplit < costSplit:
return costNoSplit
else:
return costSplit
个人经验:我在做移动端编码器时,发现全遍历四叉树决策太慢了。后来我加了一个提前终止策略——如果当前CU的残差能量低于某个阈值,直接不划分。编码速度提升了30%,压缩率只损失了不到2%。
1.4.2 帧内预测
HEVC的帧内预测从H.264的9种方向扩展到了35种。包括33种角度预测、DC模式和Planar模式。
这33种角度覆盖了从-135°到+135°的范围,精度更高。尤其是处理斜纹、渐变这类纹理时,效果提升很明显。
1.4.3 帧间预测
帧间预测这块,HEVC引入了高级运动矢量预测(AMVP)和Merge模式。说白了,就是利用相邻块的运动信息来预测当前块的运动矢量,减少传输运动矢量的码率。
我记得在项目中测试过,Merge模式在背景静止的视频里,能节省大约15%的码率。
1.4.4 变换与量化
HEVC支持4×4到32×32的DCT变换。大尺寸变换对平坦区域特别友好,能把能量更集中地压缩到低频系数里。
另外,对于4×4的帧内预测残差,HEVC还引入了DST变换。这个改动虽然小,但在某些纹理区域能提升1%~2%的压缩率。
1.4.5 环路滤波
HEVC的环路滤波包括两部分:去块效应滤波(DBF)和样点自适应补偿(SAO)。
SAO是HEVC新增的工具。它把重建像素分成几个类别,对每个类别加一个偏移量,补偿量化带来的误差。说实话,我一开始觉得SAO效果不明显,直到有一次做主观评测,发现开了SAO的画面边缘更干净,没有那种"振铃"现象。
1.4.6 熵编码
HEVC只用了CABAC,放弃了H.264中的CAVLC。CABAC的压缩效率更高,但计算复杂度也更高。
HEVC对CABAC做了优化,减少了上下文模型的数量,提高了吞吐量。在硬件实现中,CABAC往往是瓶颈,需要专门优化。
总结一下:HEVC的核心思想,就是在H.264的基础上,把每个模块都做得更精细、更灵活。CTU的大尺寸划分、35种帧内预测、高级运动矢量预测、大尺寸变换、SAO滤波——这些工具加在一起,才实现了"码率减半"的目标。
好了,第一章的内容就到这里。这些基础概念是后面所有优化技巧的根基。你先把HEVC的框架和核心模块理清楚,后面我们讲具体优化时,你才能理解为什么要那样做。