学习了前面关于码流中的NAL,VAL的知识,相对于H.264中的解码应该也有了一些了解。也知道了解码实际上是通过解析NALU获取到对应需要的数据。那么 NALU 中究竟有什么?
我们知道 NALU 是 NAL 层中传输数据的基本单位,里面包含了各式各样的数据,其中就有SPS 和 PPS。
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 是无法被解码的。
附件
下一章节将会带你学习关于 IBP帧的信息,了解真正的视频数据是以什么样的形式存在。