H264 NALU头部结构

H.264的NALU头通常有1字节(8比特) 的基本格式,在扩展模式下(如SVC或MVC)会有2字节的头部。下表详细描述了最常见的1字节头部结构。

H.264 NALU 头部结构(1字节版本)

比特位字段名称描述说明与用途
0forbidden_zero_bit禁止位必须为 0。如果网络检测到该NALU有错误,可将此位置1,以便接收方丢弃该单元。
1-2nal_ref_idc参考级别表示该NALU的重要性。
00:该NALU的内容不用于重建参考图像(如非IDR的SPS、PPS或SEI)。
大于00:该NALU的内容用于重建参考图像,值越大,重要性越高(如SPS、PPS、IDR帧、参考帧)。
3-7nal_unit_typeNALU 类型这是最重要的字段,决定了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用于数据分割(较少使用)。
5IDR图像的片关键帧,解码器收到后可以清空参考帧队列,重新开始解码。
6辅助增强信息 (SEI)包含额外的定时信息或其他增强信息。
7序列参数集 (SPS)极其重要,包含如档次、级别、分辨率、帧率等关键信息。
8图像参数集 (PPS)非常重要,包含如熵编码类型、片组等解码一幅图像所需的参数。
9访问单元分隔符 (AUD)用于在码流中标记一个完整的图像帧(访问单元)的开始。
10序列结束表示一个编码序列的结束。
11流结束表示整个码流的结束。
12填充数据-

示例

以一个1字节的NALU头 0x67 为例:

  1. 将其转换为二进制:0110 0111
  2. 按位解析:
  • 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帧的独特作用:

    1. 独立解码:和所有I帧一样,IDR帧可以独立解码,不依赖之前的帧。
    2. 重置解码器:这是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随机访问的基础,流开始的标志。

一个典型的解码开始过程:

  1. 解码器首先收到 SPSPPS,并据此初始化解码参数。
  2. 然后收到一个 IDR帧
  3. 解码IDR帧,并将其作为第一帧完整图像输出,同时清空参考帧缓冲区(此时缓冲区里只有这个IDR帧自己)。
  4. 后续的P帧(向前预测帧)会参考这个IDR帧(或之后的帧)进行解码,但绝不会参考IDR帧之前的任何帧。

希望这个详细的解释能帮助您彻底理解这三者在H.264中的核心作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值