H264的帧内编码和帧间编码
一、帧内编码
1.1、帧内编码的基本类型
H.264 支持多种帧内预测模式,主要分为三类:
1. 亮度块预测(Luma Prediction)
4x4 预测:支持 9 种方向模式(垂直、水平、对角线等)+ DC 模式 + 平面模式。
16x16 预测:支持 4 种模式(垂直、水平、DC、平面)。
8x8 预测:仅用于 High Profile,支持 9 种模式(与 4x4 类似)。
2. 色度块预测(Chroma Prediction)
对 Cb/Cr 分量,支持 4 种模式:垂直、水平、DC、平面。
3. PCM 模式
直接存储原始像素值,不进行预测(用于无法有效压缩的区域)。
1.2、I 帧的帧内压缩处理
I 帧完全依赖帧内压缩,是随机访问的关键帧。处理流程:
宏块划分:将 I 帧分割为 16x16 的宏块。
预测模式选择:
I_16x16 宏块:对整个宏块使用一种预测模式(如 DC、垂直)。
I_4x4 宏块:每个 4x4 子块独立选择预测模式(适合细节区域)。
I_PCM 宏块:直接存储像素值(无损,但开销大)。
残差计算:原始像素与预测值的差值。
变换与量化:对残差应用 DCT 变换并量化。
熵编码:使用 CAVLC 或 CABAC 编码预测模式和量化后的残差。
示例:平坦区域用 DC 预测,边缘区域用方向预测(如垂直 / 水平)。
1.3、P 帧的帧内压缩处理
P 帧以帧间预测为主,但部分区域(如预测误差大的区域)使用帧内压缩:
帧间预测优先:通过运动估计找到参考帧中的匹配块。
帧内预测备选:
若运动补偿误差超过阈值,切换到帧内模式。
支持 I_4x4、I_16x16 和 I_PCM 模式,但选择范围通常少于 I 帧。
混合编码:同一 P 帧中,部分宏块用帧间预测,部分用帧内预测。
示例:新出现的物体(参考帧中不存在)使用帧内编码。
1.4、B 帧的帧内压缩处理
B 帧依赖双向帧间预测,但也支持帧内模式作为补充:
双向预测优先:结合前向和后向参考帧进行预测。
帧内预测备选:
对双向预测失败的区域(如快速运动或遮挡),使用帧内模式。
支持的帧内模式与 P 帧类似(如 I_4x4、I_16x16)。
高效编码:B 帧的帧内编码占比通常低于 P 帧,因其双向预测能力更强。
示例:两帧之间突然出现的物体,无法通过双向预测覆盖,需用帧内编码。
1.5、三种帧的帧内压缩对比
特性 | I 帧 | P 帧 | B 帧 |
---|---|---|---|
主要依赖 | 仅帧内压缩 | 帧间压缩为主,帧内为辅 | 双向帧间压缩为主,帧内为辅 |
预测模式 | 全模式支持(I_4x4、I_16x16) | 简化模式(I_4x4、I_16x16) | 简化模式(I_4x4、I_16x16) |
压缩率 | 最低(无帧间依赖) | 中等 | 最高 |
随机访问支持 | 支持(关键帧) | 依赖前面的 I/P 帧 | 依赖前后的 I/P 帧 |
典型占比 | 约 10-15%(视频总码率) | 约 30-40% | 约 20-30% |
1.6、总结
I 帧:通过丰富的帧内模式提供独立解码能力,但压缩效率最低。
P 帧:智能混合帧内 / 帧间模式,平衡了压缩率和错误恢复能力。
B 帧:双向预测大幅减少冗余,仅在必要时使用帧内模式,压缩效率最高。
这种分层策略使 H.264 在不同场景下都能实现高效编码,广泛应用于视频会议、流媒体和存储等领域。
二、H264的帧间编码方式
H.264 的帧间编码(Inter Coding)通过分析视频帧之间的时间冗余来大幅降低码率,是实现高压缩比的核心技术。其核心机制包括运动估计与补偿、参考帧管理和多预测方向等,下面详细解析:
2.1、帧间编码的基本原理
帧间编码的核心思想是:只编码当前帧与参考帧的差异(运动信息 + 残差),而非完整像素。具体步骤:
运动估计(Motion Estimation):在参考帧中寻找与当前块最匹配的区域,计算运动矢量(MV)。
运动补偿(Motion Compensation):根据运动矢量从参考帧中提取预测块。
残差计算:当前块像素值与预测块的差值。
残差编码:对残差进行变换(如 DCT)、量化和熵编码。
2.2、关键技术点
1. 运动估计与补偿
宏块划分:将当前帧划分为 16x16 的宏块,每个宏块可进一步划分为更小的子块(如 8x8、4x4)。
搜索范围:编码器在参考帧中以当前块为中心的一定区域内搜索最佳匹配(典型范围 ±16~±64 像素)。
亚像素精度:支持 1/4 像素或 1/8 像素精度的运动矢量,通过插值提高匹配准确性。
多参考帧:H.264 允许使用多个参考帧(最多 16 个),选择最优参考帧以减少预测误差。
示例:P 帧中的一个宏块通过运动矢量指向前面 I 帧中的一个区域,仅编码两者差异。
2. 参考帧管理
参考帧列表:维护两个参考帧列表(List0 和 List1),分别用于前向和后向预测。
重排序机制:根据场景变化动态调整参考帧顺序,优先使用相关性高的帧。
长时参考帧(LTR):可将特定帧标记为长时参考,用于长时间运动的场景(如摄像机平移)。
3. 多预测方向
P 帧:仅支持前向预测(依赖前面的 I/P 帧)。
B 帧:支持双向预测(同时依赖前面和后面的参考帧),进一步提高压缩率。
加权预测:对 B 帧的双向预测结果进行加权融合(如 0.5× 前向 + 0.5× 后向)。
4. 块划分灵活性
H.264 支持多种块尺寸的运动补偿:
16x16:适合大面积平滑运动。
16x8/8x16:适合垂直或水平方向的运动。
8x8:适合复杂运动,可进一步划分为 4x4 子块。
8x4/4x8/4x4:精细划分,用于快速运动或细节区域。
5. 残差编码优化
整数变换:使用 4x4 整数 DCT 变换替代浮点变换,降低计算复杂度。
量化参数(QP):动态调整量化步长,平衡码率与画质。
熵编码:支持 CAVLC(简单)和 CABAC(高效)两种熵编码方式。
2.3、对 IPB 帧的处理差异
帧类型 | 参考帧依赖 | 预测方向 | 支持的块划分 | 典型应用场景 |
---|---|---|---|---|
I 帧 | 不依赖参考帧 | 仅帧内预测 | 4x4、8x8、16x16 | 关键帧、场景切换点 |
P 帧 | 前面的 I/P 帧 | 前向预测 | 16x16、16x8、8x16、8x8 | 运动物体的连续帧 |
B 帧 | 前面和后面的 I/P 帧 | 双向预测 | 同 P 帧 + 加权预测 | 静态背景中的运动物体 |
2.4、示例:B 帧的双向预测
假设视频序列为 I-P-B-B-P,其中 B 帧的双向预测流程:
1.前向预测:从前面的 P 帧中寻找匹配块。
2.后向预测:从后面的 P 帧中寻找匹配块。
3.加权融合:对前向和后向预测结果进行加权,生成最终预测值。
4.残差编码:仅编码 B 帧与预测值的差异。
2.5、总结
H.264 的帧间编码通过运动估计与补偿、多参考帧和灵活块划分,显著减少了视频序列的时间冗余。这种技术使 H.264 在相同画质下比 H.263 等旧标准节省 50% 以上的码率,成为视频编码领域的主流标准。