H.264 Sps 解析

  • H.264 NALUint 解析
  • H.264 NALUint 解析–实例

在之前的两篇文章 H.264 NALUint 解析 和 H.264 NALUint 解析–实例 中针对NALUint做了一个比较全面的介绍了,同时也结合了实例分析。在实例分析的过程中,我们看到,我们解析出来的头两个NALUint分别为 SPS 和PPS。

SPS和PPS一般是一个H.264码流的头两个NAL。在解码阶段,需要首先把这两个NAL输送个解码器,以让解码器从中获取解码所需的相关参数。否则解码器将无法解码成功。因为在VCL NAL中没有描述整个码流序列的相关信息。智能从这两个NAL中获取。所以我们要特别的对待这连个NAL单元。再者不用担心,这两NAL都是编码器生成的,不需要我们手动去构造。

好了我们一步步来分析他们吧。在这篇文章中,我将将注意力放在SPS中,在下一篇文章中再分析PPS。
我们先来看一下,H.264标准中SPS的语法定义吧。
H.264 Sps 解析_第1张图片

下面我们队这些字段逐个的进行一份说明:
profile_idc,level_idc: 指定本码流序列所使用的profile ,level。
H.264 Sps 解析_第2张图片
constraint_set0_flag, constraint_set1_flag,constraint_set2_flag:定义比特流必须遵从的相关规定。constraint_set0_flag对应的是Baseline Profile 的规范。constraint_set1_flag对应的是Main Profile的规范,constraint_set2_flag对应的是Extended profile的规范。当他们中不止一个位被设置为1的时候应该遵从所有这些规范。
seq_parameter_set_id: 用于在Sps与pps之间建立联系。这个值的范围是 0-31。在pps中有一个相同的字段:seq_parameter_set_id。

log2_max_frame_num_minus4: 用于计算MaxFrameNum的值:

MaxFrameNum=2(log2_max_frame_num_minus4 + 4)

其中log2_max_frame_num_minus4 的值应该在0-12之间。所以MaxFrameNum的值应该在 24 216 (16 - 256)之间。
pic_order_cnt_type : 指定解码图像顺序的计数方法 pic_order_cnt_type[02]
余下的一些参数都是用于解码过程中计算图像顺序所用的。
num_ref_frames: 指定解码过程中帧间预测需要用到的各种参考帧的最大数量。
pic_width_in_mbs_minus1: 指定以宏块为单位的图像宽度,picWidthInMbs = pic_width_in_mbs_minus1 + 1。
所以可以计算图像的像素单位宽度 width = picWidthInMbs * 16。
pic_height_in_map_units_minus1:指定帧或场的高度。picHeightInMapUints = pic_heigth_in_map_units_minus1 + 1。进而推导 height = picHeightInMapUints * 16。
frame_mbs_only_flag: 等于1表示视频序列的每个图像都是仅包含帧宏块的编码帧。
mb_adaptive_frame_field_flag: 表示帧或场宏块之间有没有交换,默认值应为0
direct_8x8_inference_flag: 指定亮度运动矢量的计算过程使用的方法。如果 frame_mbs_only_flag 等于0。那么这个位应置 1。
frame_cropping_flag: 指定是否存在输出图像剪切参数。1表示面的参数就是剪切参数。0表示没有。

大体看过这些参数之后我们之后。其实这些参数都是控制解码过程的一些细节的选项参数或者一些计算的输入值。如果我们不是一个解码器开发者,那么这些参数中的很多对于我们来说都很是陌生,或者说也获取不到太多的信息。但是我们需要关注的是profile, level,还有就是计算图像是大小。

你可能感兴趣的:(多媒体,媒体播放器,多媒体技术)