音视频学习(三十四):H264中的宏块

什么是宏块?

在 H.264 中,宏块是编码图像时最小的处理单位。它的核心作用包括:

  • 帧内预测(Intra Prediction)
  • 帧间预测(Inter Prediction)
  • 变换、量化、熵编码等

标准定义:

  • 一个宏块 = 16×16 像素(亮度 Y 分量)
  • 包含:
    • 4 个 8×8 的子块(Y 分量)
    • 8 个 8×8 的色度块(U、V 分量各 4 个)

为什么用宏块?

视频压缩的本质是去冗余

  • 空间冗余(同一帧内相似区域)→ 帧内预测
  • 时间冗余(帧之间变化不大)→ 帧间预测

宏块的使用使得这些处理可以局部进行,提高压缩效率、预测准确性。

宏块划分示意图

一个 1080p(1920×1080)的视频帧会被划分成:

text 复制代码
水平宏块数 = 1920 / 16 = 120
垂直宏块数 = 1080 / 16 = 67.5 ≈ 68(不足的部分补0)
总宏块数 ≈ 120 × 68 = 8160

H.264 宏块的编码方式

每个宏块可以选择不同的预测与编码方式来达到最优压缩效果:

帧内编码(Intra)

  • 预测模式:4×4、16×16(亮度)、8×8(色度)
  • 利用同一帧中已编码的邻近像素预测当前宏块
bash 复制代码
┌───────────────┐
│               │ ← ← ← ← ← ← ←
│               │   上方像素
│   当前宏块    │ ← ← ← ← ← ← ←
│               │
│               │
└───────────────┘
← 左侧像素参与预测

预测方向(示意):

bash 复制代码
↖ ↑ ↗ ← → ↙ ↓ ↘

帧间编码(Inter)

  • 运动估计(Motion Estimation):从前/后帧找"最像"的块
  • 支持子块划分(如 16×8、8×16、8×8、4×4)
  • 运动矢量(MV):表示宏块如何在时间维度上"移动"
bash 复制代码
帧 t+1                         帧 t
┌────────┐           查找最相似宏块
│ MB16x16│ ←←←←←←←←←←──────────────┐
└────────┘        运动矢量 MV      │
                                ┌──┴───────┐
                                │宏块参考  │
                                └──────────┘

宏块与压缩的关系

机制 说明
预测块分割越小 越能贴合图像细节 → 更高质量,但编码复杂度增加
全帧重复区域 多个宏块会复用相同预测块 → 压缩率提升
噪声图像/快速运动 预测效果差,宏块间差异大 → 码率增高

如何查看宏块信息?

FFmpeg + x264 编码日志

复制代码
x264 --verbose --output out.mp4 input.y4m

使用 ffmpeg 分析码流:

复制代码
ffmpeg -debug mb_type -i video.mp4 -f null -

你会看到每帧中宏块的预测类型(I, P, B,Intra, Inter, Skip 等)

H.265 的 CTU

在 H.265 中,宏块(MB)被更灵活的结构**CTU(Coding Tree Unit)**替代:

  • 最大支持 64×64 编码单元
  • 更灵活的划分(递归四叉树)

这让 H.265 的压缩效率比 H.264 提升约 50%。

名称 大小 用途 特点
宏块 (MB) 16x16 H.264 最小编码单元 用于帧内/帧间预测,支持子块划分
CTU (Coding Tree Unit) 最大 64x64 H.265 编码单元 更灵活,提升压缩效率
相关推荐
一弓虽16 分钟前
git 学习
git·学习
红米饭配南瓜汤2 小时前
WebRTC中的几个Rtp*Sender
网络·网络协议·音视频·webrtc·媒体
Moonnnn.2 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr73 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen3 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
布伦鸽5 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
EasyDSS5 小时前
EasyRTC嵌入式音视频通信SDK助力物联网/视频物联网音视频打造全场景应用
人工智能·音视频
aqi006 小时前
FFmpeg开发笔记(六十三)FFmpeg使用vvenc把视频转为H.266编码
ffmpeg·音视频·直播·流媒体
陳麦冬7 小时前
深入理解指针(二)
c语言·学习
babytiger8 小时前
rk3588 上运行smolvlm-realtime-webcam,将视频转为文字描述
音视频