1. H265编码基础:从标准到核心特性
各位同学,今天我们正式进入H265编码的世界。说实话,我第一次接触HEVC标准时,也被那几百页的文档吓了一跳。但别担心,我会用最直接的方式,带你理解它的核心。
1.1 H265/HEVC标准概述
H265,也叫HEVC(High Efficiency Video Coding),是ITU-T和ISO/IEC联合推出的视频编码标准。它的目标很明确——在相同画质下,码率比H264降低50%。
我在2013年第一次拿到HEVC参考软件HM时,跑一个1080p序列要等好几个小时。现在想想,那时候的优化确实粗糙。但标准本身的设计,至今仍是业界标杆。
HEVC标准的核心目标:
- 比H264节省约50%的码率
- 支持最高8192×4320分辨率(8K)
- 支持4:2:0、4:2:2、4:4:4色度采样
- 支持8-14 bit位深
1.2 H265 vs H264:到底强在哪?
很多同学问我:“老师,H265不就是H264的升级版吗?”嗯,这么说也对,但不够准确。我习惯用一个比喻:H264是手动挡,H265是自动挡——都能开到目的地,但后者更聪明、更省油。
| 对比维度 | H264/AVC | H265/HEVC |
|---|---|---|
| 编码单元 | 宏块(16×16) | CTU(最大64×64) |
| 帧内预测方向 | 9种 | 35种 |
| 运动补偿精度 | 1/4像素 | 1/4像素(亮度)/1/8像素(色度) |
| 变换块大小 | 4×4 / 8×8 | 4×4 ~ 32×32 |
| 去块滤波 | 基于宏块边界 | 基于CU边界 + SAO |
| 码率节省 | 基准 | 约40%-50% |
我的经验:实际项目中,H265的编码复杂度大约是H264的2-3倍。但解码复杂度只增加了约1.5倍。所以如果你做直播推流,编码端压力大;做播放器,解码端还好。
1.3 编码核心特性:CTU
CTU(Coding Tree Unit)是HEVC最根本的变化。H264用16×16的宏块,HEVC改用64×64的CTU,并且可以递归四叉树划分。
为什么会这样?你想想看,对于1080p视频,H264需要处理8160个宏块,而HEVC只用510个CTU。块数少了,但每个块的选择更灵活了。
避坑指南:我曾经在项目中遇到一个坑——CTU深度设得太大(比如64×64直接拆到8×8),结果编码速度暴跌。后来我总结:平坦区域用大CTU,纹理复杂区域用小CTU,这才是正确姿势。
CTU的划分结构如下:
- CU(Coding Unit):决定采用帧内还是帧间预测
- PU(Prediction Unit):决定预测的具体方式
- TU(Transform Unit):决定变换和量化
这三者的关系,我画了一张图帮你理解:
1.4 帧内预测:35种方向的选择
帧内预测,说白了就是用已经编码的像素去猜当前块的内容。H264有9种预测模式,HEVC直接增加到35种——33种角度模式 + DC模式 + Planar模式。
我记得第一次看HEVC帧内预测的代码时,被那33个角度搞晕了。后来我画了个图才明白:角度越密,对纹理的拟合越准。
帧内预测模式分类:
- Planar模式(模式0):平滑渐变,适合平坦区域
- DC模式(模式1):取平均值,适合大面积均匀区域
- 角度模式(模式2-34):覆盖从近水平到近垂直的33个方向
实际编码时,编码器会用RDO(率失真优化)去遍历这些模式,选出最优的那个。嗯,这里要注意——遍历35种模式的计算量不小,所以很多商用编码器会做快速模式决策,比如先粗筛再细选。
1.5 帧间预测:运动估计的进化
帧间预测是视频编码节省码率的大头。HEVC在H264的基础上做了几个关键改进:
- Merge模式:直接从相邻块继承运动矢量,省去传输运动矢量的开销
- AMVP(Advanced Motion Vector Prediction):更聪明的运动矢量预测
- 运动补偿精度:亮度1/4像素,色度1/8像素
我的经验:在GStreamer中集成H265编码器时,帧间预测的参数调优最影响画质。我建议你重点关注参考帧数量和搜索范围——参考帧设太多,内存吃不消;搜索范围设太大,编码速度直线下降。
帧间预测的核心流程可以概括为:
- 在参考帧中搜索匹配块
- 计算运动矢量
- 生成预测残差
- 对残差进行变换、量化、熵编码
说白了,就是找相似、算差值、压缩差值。这个思路从MPEG-1时代就没变过,但HEVC把每一步都做得更精细了。
曾经踩过的坑:有一次我在嵌入式平台上跑HEVC编码,发现运动估计特别慢。排查了半天,原来是搜索范围设成了256像素。对于1080p视频,这个范围太大了。后来我改成64像素,速度提升了3倍,画质几乎没损失。
1.6 本章小结
这一章我们覆盖了H265/HEVC的三个核心概念:
- CTU:从16×16宏块到64×64四叉树,灵活性大幅提升
- 帧内预测:35种模式,更精细的方向拟合
- 帧间预测:Merge、AMVP、更细的运动补偿