标题 H.264 码流结构概念解析
H.264(又称AVC)的码流结构是一个分层封装体系,设计目标是兼顾编码效率、网络适应性和解码可靠性。其核心思想是通过多级抽象,将视频数据、控制参数和元数据分离。以下是其核心概念的分层解析:
码流层级结构(从高到低)
H.264码流可分解为四个逻辑层次:
层级 | 组成单元 | 作用 |
---|---|---|
视频序列层 | Sequence | 完整视频流,包含多个GOP(图像组) |
图像层 | Frame/Slice | 单帧图像数据(I/P/B帧),可能被分割为多个Slice |
片层 | Macroblock | 16×16像素块,编码的基本单位 |
子块层 | 4×4/8×8 变换块 | DCT变换、量化的最小单元 |
标题NALU(网络抽象层单元)
NALU(Network Abstraction Layer Unit) 是H.264码流的最小传输单元,每个NALU独立封装,包含头部和负载数据。
NALU的两种封装格式
格式 | 标识方式 | 应用场景 |
---|---|---|
Annex B | 起始码 00 00 00 01 | 实时传输(RTP/TS流)、文件存储(.h264) |
AVCC | 长度前缀(4字节) | MP4容器、FLV封装 |
Annex B:更适合实时传输,兼容性好但解析稍慢。
AVCC:更适合文件存储,支持快速随机访问,需容器配合。
转换工具:FFmpeg、GPAC等可无损转换两种格式。
开发注意:处理AVCC时需先读取avcC盒子,而Annex B需实时检测起始码。
对比维度 | Annex B | AVCC (AVC1) |
---|---|---|
NALU分隔方式 | 起始码 00 00 00 01 或 00 00 01 | 4字节大端长度前缀(如 00 00 02 1F) |
典型应用场景 | RTP传输、TS流、.h264裸流文件 | MP4、FLV、MKV等容器 |
参数集存储 | 分散在码流中(通过SPS/PPS NALU) | 集中在文件头(avcC盒子中) |
兼容性 | 所有H.264解码器支持 | 需容器支持(如MP4的avcC配置盒) |
随机访问性能 | 较差(需扫描起始码) | 更好(直接跳转长度前缀) |
修改复杂度 | 高(需处理变长起始码) | 低(长度固定) |
关键NALU类型
H.264定义了多种NALU类型,以下是核心分类:
类型值 | 名称 | 作用 | 示例场景 |
---|---|---|---|
1 | 非IDR Slice | 普通视频帧数据(P帧/B帧) | 连续视频帧 |
5 | IDR Slice | 关键帧(可独立解码,清空参考缓冲区) | 视频seek点、直播流首帧 |
6 | SEI | 补充增强信息(时间戳、水印等) | 携带元数据 |
7 | SPS | 序列参数集(分辨率、帧率、Profile/Level等全局参数) | 解码初始化 |
8 | PPS | 图像参数集(熵编码模式、参考帧数量等) | 解码配置 |
9 | AUD | 访问单元分隔符(标记帧边界) | 直播流分帧 |
参数集(Parameter Sets)
H.264通过参数集分离关键配置信息,避免重复传输:
(1) SPS(Sequence Parameter Set)
作用:定义视频序列的全局参数
包含信息:
profile_idc // 编码档次(如66=Baseline, 77=Main, 100=High)
level_idc // 级别限制(决定最大分辨率/码率等)
pic_width_in_mbs // 图像宽度(以宏块为单位)
pic_height_in_mbs // 图像高度
frame_mbs_only // 0=隔行扫描,1=逐行扫描
log2_max_frame_num // 帧序号的最大比特数
(2) PPS(Picture Parameter Set)
作用:定义单帧图像的编码参数
包含信息:
entropy_coding_mode // 0=CAVLC,1=CABAC
num_ref_idx_l0_active // 前向参考帧数量
weighted_pred_flag // 加权预测标志
Slice(片)与宏块(Macroblock)
(1) Slice的作用
将一帧图像分割为多个独立编码区域
提高容错性(某Slice损坏不影响其他部分)
支持并行编码/解码
(2) 宏块(Macroblock)
基本单位:16×16像素块
子分区:可进一步分为8×8或4×4子块
包含数据:
| 预测模式 | 运动向量 | 残差系数 |
码流示例分析
00 00 00 01 67 64 00 1E ... // SPS
00 00 00 01 68 EE 3C 80 ... // PPS
00 00 00 01 65 88 80 21 ... // IDR帧
00 00 00 01 41 9A 01 23 ... // P帧