H.264的NALU头通常有1字节(8比特) 的基本格式,在扩展模式下(如SVC或MVC)会有2字节的头部。下表详细描述了最常见的1字节头部结构。
H.264 NALU 头部结构(1字节版本)
| 比特位 | 字段名称 | 描述 | 说明与用途 |
|---|---|---|---|
| 0 | forbidden_zero_bit | 禁止位 | 必须为 0。如果网络检测到该NALU有错误,可将此位置1,以便接收方丢弃该单元。 |
| 1-2 | nal_ref_idc | 参考级别 | 表示该NALU的重要性。 00:该NALU的内容不用于重建参考图像(如非IDR的SPS、PPS或SEI)。 大于00:该NALU的内容用于重建参考图像,值越大,重要性越高(如SPS、PPS、IDR帧、参考帧)。 |
| 3-7 | nal_unit_type | NALU 类型 | 这是最重要的字段,决定了NALU载荷数据的类型。常见类型如下: 1-5: 编码条带(Slice),属于视频数据本身。 6: 补充增强信息(SEI)。 7: 序列参数集(SPS),包含全局编码参数。 8: 图像参数集(PPS),包含一帧或几帧的编码参数。 9: 访问单元分隔符(AUD)。 5: 关键帧(IDR帧)的条带。 |
NALU 类型 (nal_unit_type) 常见值详解表
| 十进制值 | 类型 | 描述 |
|---|---|---|
| 0 | 未指定 | - |
| 1 | 非IDR图像片 | 非关键帧的片数据。 |
| 2 | 片数据分区A | 用于数据分割(较少使用)。 |
| 3 | 片数据分区B | 用于数据分割(较少使用)。 |
| 4 | 片数据分区C | 用于数据分割(较少使用)。 |
| 5 | IDR图像的片 | 关键帧,解码器收到后可以清空参考帧队列,重新开始解码。 |
| 6 | 辅助增强信息 (SEI) | 包含额外的定时信息或其他增强信息。 |
| 7 | 序列参数集 (SPS) | 极其重要,包含如档次、级别、分辨率、帧率等关键信息。 |
| 8 | 图像参数集 (PPS) | 非常重要,包含如熵编码类型、片组等解码一幅图像所需的参数。 |
| 9 | 访问单元分隔符 (AUD) | 用于在码流中标记一个完整的图像帧(访问单元)的开始。 |
| 10 | 序列结束 | 表示一个编码序列的结束。 |
| 11 | 流结束 | 表示整个码流的结束。 |
| 12 | 填充数据 | - |
示例
以一个1字节的NALU头 0x67 为例:
- 将其转换为二进制:
0110 0111。 - 按位解析:
0(第1位):forbidden_zero_bit= 0 (正常)11(第2-3位):nal_ref_idc= 3 (高优先级,非常重要)00111(第4-8位):nal_unit_type= 7 (SPS - 序列参数集)
这个解析结果符合SPS的特性:它是一个至关重要的全局参数集,因此其 nal_ref_idc 值很高。
SPS PPS IDR
- SPS(序列参数集):像 项目总章程。它定义了整个视频项目的全局性、基础性的规则。
- PPS(图像参数集):像 某次任务的详细说明书。它基于总章程,定义了如何解码一组图像(一个或多个帧)的具体方法。
- IDR图像的片(关键帧):像 一个全新的、完整的起点。它不仅是图像数据,还携带了一个重要指令:“忘记之前的所有内容,从这里开始重新构建。”
下面我们进行详细分解。
1. SPS(序列参数集 - Sequence Parameter Set)
SPS 包含了指导整个视频序列解码所需的所有全局参数。它不包含任何实际的图像像素数据,但解码器必须成功接收到并正确解析 SPS 之后,才能开始解码后续的图像。
SPS 中包含的关键信息有:
- 档次和级别(Profile & Level):标识编码器使用了H.264的哪些高级特性(如Baseline, Main, High Profile)以及解码所需的计算能力、内存大小和码率上限。
- 图像分辨率:视频的宽度和高度。
- 帧率相关:解码帧率的控制信息。
- 参考帧数目:解码过程中可以保留多少帧作为参考帧的最大值。
- 熵编码方式:使用CAVLC(较简单)还是CABAC(压缩率高但复杂)。
- 色度格式:通常是YUV 4:2:0。
重要性:
- 解码的“钥匙”:没有SPS,解码器根本不知道如何解读后续的数据流。这就是为什么在播放视频文件或网络流时,如果SPS丢失或损坏,视频会完全无法播放或花屏。
- 不频繁变化:一个视频流通常只有一个SPS,除非中途编码参数发生根本性改变(如分辨率变化),否则不会重复发送。
NALU 特征: nal_unit_type = 7,并且通常 nal_ref_idc != 0(表示它非常重要)。
2. PPS(图像参数集 - Picture Parameter Set)
PPS 包含了解码一幅或几幅图像(一个“片组”)所需的参数。它是对SPS中全局参数的具体化。一个SPS可以被多个不同的PPS引用,而一个PPS也可以被多幅图像引用。
PPS 中通常包含的信息有:
- 引用的SPS ID:指明本PPS使用的是哪个SPS的规则。
- 熵编码模式:具体指定对本图像使用CABAC还是CAVLC(在某些档次下可覆盖SPS的设置)。
- 片组相关信息:定义了图像如何划分成更小的“片”来进行并行解码和错误恢复。
- 量化参数:控制解码时反量化的细节,影响图像质量。
重要性:
- 承上启下:PPS将全局的SPS规则与具体的图像解码过程连接起来。
- 变化相对频繁:虽然不如图像数据本身变化快,但编码器可能会根据场景复杂度切换使用不同的PPS以优化编码。
NALU 特征: nal_unit_type = 8,并且通常 nal_ref_idc != 0。
3. IDR图像的片(Instantaneous Decoding Refresh Picture)
IDR帧是一种特殊的 I帧(关键帧),但比普通I帧多了一个至关重要的特性:清空参考帧缓冲区。
-
什么是I帧?
I帧是使用帧内预测编码的帧,它只利用自身的信息进行压缩,不依赖任何其他帧。因此,它可以独立解码,形成一个完整的图像。I帧是随机访问(如拖动进度条)的基础。 -
IDR帧的独特作用:
- 独立解码:和所有I帧一样,IDR帧可以独立解码,不依赖之前的帧。
- 重置解码器:这是IDR帧最核心的功能。当解码器遇到一个IDR帧时,它必须清空之前存储的所有参考帧。这意味着IDR帧之后解码的帧(P帧、B帧)绝对不可能去引用IDR帧之前的任何帧。
为什么这个“重置”功能如此重要?
- 随机访问(Seek):当你在播放器中拖动进度条时,播放器会寻找最近的一个IDR帧开始解码。因为IDR帧重置了参考关系,确保从这一点开始解码不会出错(比如引用了已经被跳过的、不可用的帧)。
- 错误恢复:如果码流在传输中发生错误,导致解码状态混乱,下一个IDR帧可以作为一个“安全点”,让解码器恢复到正确的状态。
- 频道切换:在直播流中,新加入的观众总是从最新的IDR帧开始解码,以确保能正确同步。
NALU 特征: nal_unit_type = 5,并且 nal_ref_idc 通常很高(因为它是重要的参考帧)。
总结与关系
| 元素 | 角色比喻 | 功能 | NALU Type | 关键点 |
|---|---|---|---|---|
| SPS | 宪法/蓝图 | 定义整个视频流的全局规则(分辨率、档次等)。 | 7 | 解码的前提,变化极少。 |
| PPS | 地方法规/施工图 | 基于SPS,定义解码具体图像片的参数。 | 8 | 连接SPS和图像数据。 |
| IDR帧 | 里程碑 & 新起点 | 1. 一个可独立解码的关键帧。 2. 重置参考帧队列,禁止向后引用。 | 5 | 随机访问的基础,流开始的标志。 |
一个典型的解码开始过程:
- 解码器首先收到 SPS 和 PPS,并据此初始化解码参数。
- 然后收到一个 IDR帧。
- 解码IDR帧,并将其作为第一帧完整图像输出,同时清空参考帧缓冲区(此时缓冲区里只有这个IDR帧自己)。
- 后续的P帧(向前预测帧)会参考这个IDR帧(或之后的帧)进行解码,但绝不会参考IDR帧之前的任何帧。
希望这个详细的解释能帮助您彻底理解这三者在H.264中的核心作用。


被折叠的 条评论
为什么被折叠?



