3. H264编码原理入门

H.264(AVC)之所以能在同等画质下比 MPEG-2 节省约 50% 码率,核心在于它把一帧画面拆成可独立处理的“宏块”,并围绕宏块建立了一整套“预测—残差—变换—量化—熵编码”的流水线。理解这条流水线,是后续做性能优化和与 H.265 对比的基础。本节按编码顺序,把宏块、帧内预测、帧间预测、变换量化、熵编码五个环节串起来讲清楚。

一、宏块:H.264 编码的基本处理单元

H.264 把每帧图像划分为固定大小的宏块(Macroblock,MB),一个宏块默认是 16×16 亮度像素,外加对应的 8×8 色度像素(4:2:0 采样下,亮度 16×16 对应两个 8×8 色度块)。宏块是预测、变换、量化、熵编码共同作用的最小单位,也是码率控制中 QP 调整的粒度。

为了适应不同细节程度,H.264 允许把 16×16 宏块进一步划分为子宏块:帧内可细分为 16×16、8×8、4×4;帧间可细分为 16×16、16×8、8×16、8×8,8×8 还能继续拆成 8×4、4×8、4×4。划分越细,运动补偿越精确,但运动矢量等边信息开销也越大,编码器需要在率失真代价下做选择。

宏块类型(mb_type)决定了该宏块走帧内还是帧间、用哪种划分、用哪种预测模式,是解码器解析码流时最先确定的信息之一。

二、帧内预测:利用同一帧内的空间相关性

帧内预测(Intra Prediction)不参考其他帧,只用当前帧中已重建的相邻像素来预测当前块。H.264 为亮度 4×4 提供 9 种预测模式(DC + 8 个方向),8×8 提供 9 种,16×16 提供 4 种(Vertical、Horizontal、DC、Plane);色度 8×8 提供 4 种。编码器遍历候选模式,计算预测残差,选率失真代价最小的模式写入码流。

方向性预测是帧内预测的关键:例如 Vertical 模式用上方一行像素向下复制,Horizontal 用左侧一列向右复制,Diagonal 类模式沿特定角度插值。平坦区域适合 16×16 DC/Plane,纹理复杂区域适合 4×4 多方向模式。预测后得到残差块,残差通常比原始像素小得多,后续变换量化才有压缩空间。

三、帧间预测:利用时间相关性做运动补偿

帧间预测(Inter Prediction)在已编码的参考帧中寻找与当前块最匹配的区域,用运动矢量(MV)描述位移,只编码“运动矢量 + 残差”。H.264 支持 P 帧(前向参考)和 B 帧(双向参考),并支持多参考帧、亚像素精度运动补偿(亮度 1/4 像素,色度 1/8 像素)。

运动估计(ME)在参考帧搜索窗内找最佳匹配,常用 SAD/SATD 作为匹配准则;运动补偿(MC)按 MV 从参考帧取像素并插值生成预测块。B 帧还支持直接模式、双向加权预测,能显著降低码率。帧间预测的收益取决于运动估计精度与搜索范围,但搜索越细,编码耗时越高,这正是后续优化的重点。

四、变换量化:把残差压缩成稀疏系数

预测后的残差块经过整数 DCT 变换(4×4 或 8×8),把能量集中到低频系数,再用量化步长 Qstep 除以系数并取整。量化是 H.264 中唯一真正“有损”的环节,QP 越大,量化越粗,系数被大量置零,码率下降但细节丢失。H.264 用 QP 索引 0~51 控制量化步长,QP 每增加 6,Qstep 约翻倍。

残差块 → 整数DCT变换 → 量化 → 熵编码
                ↑
             QP控制量化步长
逆过程:熵解码 → 反量化 → 反变换 → 重建块 → 参考帧

变换量化后,系数按 Zig-Zag 扫描排列,使低频集中在前、高频零值集中在后,便于熵编码用游程编码压缩。重建帧由“预测块 + 反量化反变换后的残差”得到,并经过去块滤波(Deblocking)减少块效应,再存入参考帧队列。

五、熵编码:把语法元素变成最终码流

熵编码负责把宏块类型、预测模式、运动矢量、量化系数等语法元素无损压缩成比特流。H.264 提供两类方案:CAVLC(基于上下文的自适应变长编码)和 CABAC(基于上下文的自适应二进制算术编码)。CAVLC 实现简单、计算量小;CABAC 压缩率通常高 10%~15%,但编解码复杂度更高。

CAVLC 利用非零系数个数、拖尾系数、非零系数幅值等上下文建模;CABAC 则对每个二进制符号用自适应概率模型做算术编码,能更贴近实际符号分布。码流最终按 NAL 单元封装,SPS/PPS 描述序列与图像参数,切片(Slice)承载宏块数据。

六、完整流程与关键参数对照

环节输入核心操作输出关键参数
宏块划分原始帧16×16 及子宏块划分宏块/子宏块mb_type、划分方式
帧内预测相邻已重建像素方向性预测帧内残差Intra 模式 0~8
帧间预测参考帧、MV运动估计与补偿帧间残差MV、参考帧数、亚像素
变换量化残差块整数 DCT + 量化量化系数QP、Qstep、变换尺寸
熵编码语法元素CAVLC / CABACH.264 码流熵编码模式、上下文

七、案例与常见误区

以一个 1080p 监控场景为例:静止背景区域大量宏块走帧间 16×16 + SKIP,几乎不传残差;运动人物边缘走 8×8 或 4×4 帧间划分,MV 精细;文字标牌区域可能选帧内 4×4 方向预测,避免帧间模糊。编码器在率失真优化下逐宏块决策,最终码率可能只有全帧内编码的 1/3。

常见误区一:认为“帧内预测就是 I 帧、帧间预测就是 P/B 帧”。实际上 I 帧内所有宏块都用帧内预测,P/B 帧内也可以有帧内宏块,用于场景切换或遮挡区域。误区二:把量化当成“可逆压缩”。量化是唯一有损环节,QP 直接决定画质与码率平衡。误区三:忽略去块滤波和重建帧的作用,参考帧质量差会通过帧间预测逐帧传播误差。
优化提示:帧内预测模式选择、运动估计搜索范围、QP 分配、CABAC 开关,是 H.264 编码器最常调的四个性能旋钮。理解本节流水线后,就能判断每个旋钮影响的是哪一环节的率失真代价。
H.264 编码基本流程:宏块 → 预测 → 变换量化 → 熵编码 原始视频帧 YUV 4:2:0 宏块划分 16×16 / 子宏块 帧内预测 空间相关性 · 9 种模式 帧间预测 时间相关性 · MV 补偿 残差块 原始 − 预测 变换 + 量化 整数DCT · QP/Qstep 熵编码 CAVLC / CABAC H.264 码流 NAL / Slice 反量化 + 反变换 重建残差 去块滤波 + 参考帧 Deblocking · DPB 参考帧反馈 帧内路径 帧间路径 重建回路

把这条流水线记牢:宏块是单位,预测去相关,变换量化压能量,熵编码收尾,重建帧再反馈给后续帧做参考。后续讨论 H.264 性能优化时,无论是调整 QP、开闭 CABAC,还是改运动搜索策略,本质上都是在改变这条流水线中某一环的率失真代价。