学习了前面关于码流中的NAL,VAL的知识,相对于H.264中的解码应该也有了一些了解。也知道了解码实际上是通过解析NALU获取到对应需要的数据。那么 NALU 中究竟有什么?

我们知道 NALU 是 NAL 层中传输数据的基本单位,里面包含了各式各样的数据,其中就有SPSPPS

SPS( Sequence Paramater Set)

SPS是什么

SPS 即 Sequence Paramater Set,SPS中保存了一组编码视频序列(coded video sequence,即为原始视频的一帧一帧的数据经过编码之后的结构组成的序列)的全局参数。

由此可见,SPS中的信息至关重要。如果其中的数据丢失或出现错误,解码过程很可能会失败。

SPS在NALU类型

在H.264标准协议中规定了多种不同的NAL Unit类型,其中type 7表示该NAL Unit内保存的数据为SPS。一般情况SPS的NAL Unit通常位于整个码流的起始位置

SPS包含的参数及作用

参数包含了必要的配置解码器的信息,比如标识各档次的profile,标识当前码流的level,resolution,标识seq_parameter_set_id,代表为帧编码或场编码编码的标识frame_mbs_only_flag

具体了解可查看底部附件编码7.3.2.1章节。

挑选几个重要的参数来说:

  • profile_idc,表明档次,基本分为三种

    • baseline profile(profile_idc = 66)
    • mian profile(profile_idc = 77)
    • extended profile(profile_idc = 88)

profile_idc的作用:规定了不同的编码方式,需要根据对应的profile对sps进行解码。

  • level_idc,表明当前码流的Level

主要作用:定义了在对应的Level_idc情况下,最大视频分辨率及帧率等参数。

  • seq_parameter_set_id

PPS(Picture Paramater Set)

PPS 是什么

PPS 即 Picture Paramater Set。包含一幅图像所用的公共参数,即一幅图像中所有片段SS(Slice Segment)引用同一个PPS。

PPS中存在一些与SPS中相同的参数,PPS中的这些数值将会覆盖SPS中他们的取值,即SS使用PPS中的这些参数进行解码。解码开始时,PPS全部处于非活动状态,当一幅图像解码时引用了某个PPS时,该PPS被激活,同一时刻只能有一个PPS被激活,直到该图像编码结束。

PPS在MALU类型

通常情况下,PPS在H.264的码流中单独保存在一个NALU中,NALU的NALU type为8;而在封装格式中,PPS通常与SPS一起,保存在码流的起始位置

PPS包含的参数机器作用

PPS对应的是一个序列中某一幅图像或者某几幅图像,包括一个图像的slice的所有相关信息,如图像类型、序列号、标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目(slice groups)、初始量化参数和去方块滤波系数调整标识等等,解码时某些序列号的丢失可用来校验信息包的丢失与否

具体了解可查看底部附件中7.3.2.2章节

SPS和PPS在码流中的图解

正常情况下,在H.264码流中

第一个 NALU 是 SPS

第二个 NALU 是 PPS

第三个 NALU 是 IDR(即时解码器刷新,其实就是第一个 I 帧,后续介绍 I 帧时会介绍)

一般情况下,如下图所示:

是不是清晰了许多

SPS 与 PPS 后面跟随 IDR 帧(IDR 帧一般为视频开始解码的第一个帧),SPS 为后续所有的 SS(Slice Segment)提供了公共参数。从图中同样可以看出 SPS 及 PPS 的重要性,事实上,SPS 与 PPS 中提供的公共参数,为整个解码流程提供了十分重要的数据比如(分辨率,图像序列等等),如果一个码流中丢失了 SPS 及 PPS 参数信息,那么该码流中的 NALU 是无法被解码的。

附件

📎ITU-T H.264建议书.pdf

下一章节将会带你学习关于 IBP帧的信息,了解真正的视频数据是以什么样的形式存在。

扩展阅读