音视频学习(三十四):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 编码单元 更灵活,提升压缩效率
相关推荐
chase。16 小时前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人
兵叔物联16 小时前
基于FFmpeg的短视频自动剪辑工具
ffmpeg·音视频
AORUO奥偌16 小时前
从“拼凑”到“集成”:音视频系统如何重塑弱电智能化建设逻辑
音视频·公共广播系统·音视频系统·多媒体会议与ip广播系统·多媒体会议系统
AOwhisky17 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
前端世界17 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
dear_bi_MyOnly17 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
禹亮科技17 小时前
大型国企会议室音视频集成实战:3间120㎡空间Poly G7500+LED大屏+讯飞多语言会议系统落地方案
音视频·视频会议系统集成·上海禹亮科技·讯飞听见多语言会议系统·poly g7500
AOwhisky17 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
math_hongfan17 小时前
鸿蒙Flutter setState机制深入理解
学习·flutter·华为·harmonyos·鸿蒙
其实防守也摸鱼17 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞