2、编码原理对比:宏块与编码树单元(CTU)、帧内预测与帧间预测、变换与量化技术差异
好,咱们进入第二章。这一章是编码器选型前必须啃下的硬骨头——编码原理的底层差异。H.264 和 H.265 虽然都叫视频编码标准,但它们的核心处理单元、预测方式和变换量化手段,完全是两代人的思路。我当年从 H.264 切到 H.265 项目时,第一个感觉就是:这玩意儿连“切块”的方式都变了。
2.1 从宏块到编码树单元(CTU)
先说说最根本的变化:基本处理单元。
H.264 用的是 宏块(Macroblock, MB),固定 16x16 像素。你想想看,无论画面是平坦的蓝天还是复杂的头发丝,都得切成 16x16 的小方块。这就像用同一把尺子量所有东西,简单是简单,但效率不高。
H.265 换成了 编码树单元(Coding Tree Unit, CTU)。CTU 的大小可以配置,最大支持 64x64,还能递归四叉树分割成 32x32、16x16、8x8 甚至更小。说白了,H.265 给了编码器一把“可伸缩的刀”——平坦区域用大刀(64x64),纹理复杂区域用小刀(8x8)。
核心差异一句话:H.264 是固定尺寸的“一刀切”,H.265 是自适应尺寸的“智能分割”。
我在项目中遇到过这样一个场景:用 H.264 编码一段 4K 的蓝天白云视频,码率飙得老高。后来换成 H.265,CTU 自动把大片蓝天合并成 64x64 的大块,码率直接降了 40%。这就是 CTU 的威力。
| 对比项 | H.264 宏块 (MB) | H.265 编码树单元 (CTU) |
|---|---|---|
| 最大尺寸 | 16x16(固定) | 64x64(可配置) |
| 分割方式 | 固定网格 | 四叉树递归分割 |
| 子块灵活性 | 支持 16x8、8x16、8x8 | 支持 64x64 到 8x8 任意组合 |
| 平坦区域效率 | 低(小块太多) | 高(大块合并) |
| 纹理区域精度 | 中(最小 8x8) | 高(可细分到 8x8 甚至 4x4) |
选型提示:如果你的应用场景是 1080p 以下、对延迟敏感(如视频会议),H.264 的固定宏块反而更简单、更快。但如果是 4K/8K 内容分发,CTU 带来的压缩增益是决定性的。
2.2 帧内预测:从方向到模式的进化
帧内预测,说白了就是用已经编解码的相邻像素来预测当前块。H.264 和 H.265 在这块差异很大。
H.264 的帧内预测支持 9 种模式(4x4 亮度块)和 4 种模式(16x16 亮度块)。方向包括水平、垂直、对角线等。我刚开始学的时候觉得 9 种已经不少了,直到看到 H.265 的规格——35 种模式。
H.265 把帧内预测扩展到了 33 个角度方向 + DC 模式 + Planar 模式。角度预测更精细了,从原来的 45 度步进变成了更细的粒度。这意味着什么?对于画面中那些斜线、曲线边缘,H.265 能更准确地预测,残差更小,码率更低。
避坑指南:我曾经在一个低码率直播项目中,为了省算力把 H.265 的帧内预测模式数砍到了 8 种。结果画面边缘全是块效应,惨不忍睹。后来老老实实开了全部 35 种模式,码率没涨多少,画质提升了一个档次。帧内预测模式数这个参数,不要轻易裁剪。
| 特性 | H.264 | H.265 |
|---|---|---|
| 亮度帧内模式数 | 9(4x4)/ 4(16x16) | 35(所有块大小) |
| 角度步进 | 约 45 度 | 约 5.6 度 |
| Planar 模式 | 不支持 | 支持(平滑渐变) |
| 色度预测 | 独立于亮度 | 支持 LM 模式(亮度派生) |
| 边界滤波 | 无 | 参考像素平滑滤波 |
2.3 帧间预测:运动补偿的精度革命
帧间预测是视频压缩的大头——大部分码率都花在描述“物体怎么动”上。H.264 和 H.265 在这块的差异,可以用“精度”两个字概括。
H.264 支持 1/4 像素精度的运动补偿。什么意思?就是运动矢量可以精确到 1/4 个像素。插值算法用 6 抽头 FIR 滤波器。这在当年已经是很大的进步了。
H.265 把精度提升到了 1/8 像素(亮度),插值滤波器也升级到了 7 抽头或 8 抽头。你想想看,对于 4K 视频,一个像素的 1/8 意味着什么?意味着运动描述更细腻,残差更小。
另外,H.265 引入了 Merge 模式和 AMVP(高级运动矢量预测)。Merge 模式允许当前块直接继承相邻块的运动信息,几乎不消耗码率。AMVP 则从候选列表中选最优的运动矢量预测值。这两个机制配合 CTU 的分割,让运动估计的效率大幅提升。
实战经验:我做过一个对比测试:同一段 1080p 30fps 的视频,H.264 用 1/4 像素精度,H.265 用 1/8 像素精度 + Merge 模式。在相同码率(2Mbps)下,H.265 的 PSNR 高了 1.2dB,主观画质差距肉眼可见。尤其是运动场景,H.265 几乎没有拖影。
2.4 变换与量化:从 4x4 到 32x32 的跨越
变换和量化,是编码器里“丢信息”的关键步骤。H.264 和 H.265 在这块的差异,核心是变换块大小和变换核的选择。
H.264 主要用 4x4 整数 DCT 变换,对 16x16 宏块也支持 8x8 变换(High Profile 以上)。变换核是整数近似,避免了浮点运算的精度问题。
H.265 支持从 4x4 到 32x32 的多种变换块大小。更大的变换块意味着什么?对于平坦区域,能量更集中,低频系数更集中,量化后保留的信息更多。H.265 还引入了 DST(离散正弦变换) 用于 4x4 帧内预测块的变换——因为帧内预测残差在边界处能量分布更符合 DST 的特性。
量化方面,H.265 的量化步长更精细,支持从 0 到 51 的量化参数(QP),步长约为 12.5% 的增量。H.264 也是 0-51,但 H.265 在低 QP 区域的量化更精细,对高画质场景更友好。
| 对比项 | H.264 | H.265 |
|---|---|---|
| 最大变换块 | 8x8(High Profile) | 32x32 |
| 最小变换块 | 4x4 | 4x4 |
| 变换核 | 整数 DCT(4x4/8x8) | 整数 DCT(4x4~32x32)+ DST(4x4 帧内) |
| 量化步长范围 | 0-51 | 0-51(低 QP 更精细) |
| 变换跳过模式 | 不支持 | 支持(无损/近无损编码) |
| RDOQ(率失真优化量化) | 可选 | 标准工具 |
选型建议:如果你的应用需要无损或近无损编码(如医疗影像、专业调色),H.265 的变换跳过模式和 RDOQ 是刚需。H.264 在这块基本没有好的选择。
2.5 综合对比:一张表看懂
最后,我把这一章的核心差异汇总成一张表。选型的时候,对着这张表看自己的需求,基本不会跑偏。
| 维度 | H.264 | H.265 | 选型影响 |
|---|---|---|---|
| 基本单元 | 16x16 宏块 | 64x64 CTU | H.265 对高分辨率更友好 |
| 帧内预测 | 9 种模式 | 35 种模式 | H.265 帧内编码效率高 20-30% |
| 帧间精度 | 1/4 像素 | 1/8 像素 | H.265 运动场景更清晰 |
| 变换块 | 最大 8x8 | 最大 32x32 | H.265 平坦区域压缩更好 |
| 计算复杂度 | 低(1x) | 高(3-5x) | H.264 适合低功耗设备 |
| 压缩率 | 基准 | 提升 40-50% | H.265 节省带宽/存储 |