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的核心流程串起来了。你仔细看,会发现它其实是一个带反馈的环路结构。

HEVC编码框架流程图 HEVC 混合编码框架核心流程 输入视频帧 CTU划分与四叉树决策 帧内预测 / 帧间预测 35种方向 / 高级运动矢量预测 残差计算 DCT/DST变换 + 量化 CABAC熵编码 HEVC码流 反量化 + 反变换 重建帧 去块效应 + SAO滤波 环路反馈 关键点 • 环路反馈保证编解码一致 • SAO是HEVC新增工具 • CABAC上下文模型更精细

嗯,这张图信息量不小。我带你走一遍:

  1. 输入帧先被划分成CTU(编码树单元),最大64×64。
  2. 每个CTU通过四叉树递归划分,决定最优的编码单元大小。
  3. 然后进入预测模块——帧内预测用35种方向,帧间预测用高级运动矢量预测。
  4. 原始块减去预测块得到残差。
  5. 残差经过DCT/DST变换和量化,变成系数。
  6. 系数通过CABAC熵编码输出码流。
  7. 同时,量化后的系数要经过反量化、反变换,加上预测值得到重建帧。
  8. 重建帧经过去块效应滤波和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的框架和核心模块理清楚,后面我们讲具体优化时,你才能理解为什么要那样做。