H264 SPS/PPS 分析

SPS 文件分析

H264文件对应的SPS参数如下:
9816B 的SPS 长度为20:
00 00 00 01 67 4D 00 2A 96 35 40 F0 04 4F CB 37 01 01 01 02
参考H264 的制定标准,对上述的字节解析如下:
在这里插入图片描述
下面对上图进行挨个分析,

  • 00 00 00 01 :Start Code , 是Annexb 封装格式的分割标志
  • 67:NALU TYPE ,该字节通过&0x1f 后结果 是 5:I 帧 6:SEI 8:PPS 7:SPS P:1
    过了前面4-5 字节之后(有的startcode 为000001)才是真实的SPS信息sps_parameter_set_data(),对上面的20个字节来说,
    4D 00 2A 96 35 40 F0 04 4F CB 37 01 01 01 02才是 SPS 的数据
  1. 第一个字节是profile_idc = 0x4d,该字节用来标识H264的码流档次,而在H264中定义了常用的三个档次,他们对应的判断标准如下:
  • baseline profile——>66
  • main profile——>77
  • extended profile——>88

目前9816B SPS第一个字节为0x4d = 77,意味着我们使用的是main profile

  1. 第二个字节是constraint_set0_flag ~ constraint_set5_fla + reserve ,其含义是在编码的档次方面增加额外要求。
    目前9816B 为00,无特殊限定要求

  2. 第三个字节是level_idc= 2A = 42,编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数
    目前9816B 为 42,对应的level是4.2, support 2kx 1k format.Frame coding only .125829120 samples/sec

  3. seq_parameter_set_id ,当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。使用分析工具得到值为0

  4. log2_max_frame_num_minus4
    用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +
    4)。MaxFrameNum是frame_num的上限值,frame_num是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段,区间是0-12
    9816B 的值是12

  5. max_num_ref_frames,用于表示参考帧的最大数目。

  6. gaps_in_frame_num_value_allowed_flag,标识位,说明frame_num中是否允许不连续的值

  7. pic_width_in_mbs_minus1用于计算图像的宽度。
    计算方法为: frameWidth = 16 * (pic_width_in_mbs_minus1 + 1),在9816B中计算为1920

  8. frame_mbs_only_flag,标识位,说明宏块的编码方式.
    frame_mbs_only_flag等于0指明了视频序列的编码图象可能是编码场或编码帧。frame_mbs_only_flag等于1指明了每个编码视频序列的编码图像都是只含帧宏块的编码帧。

  9. pic_height_in_map_units_minus1 用于计算图像的高度
    高度 = 16 * (pic_height_in_map_units_minus1 + 1); 在9816B 中,高度计算为1088

PPS分析

在9816B码流中,PPS数据为: 00 00 00 01 68 EE 31 B2
解析如下图:
在这里插入图片描述

  1. pic_parameter_set_id
    表示当前PPS的id。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。该值的取值范围为[0,255]。
    目前我们9816B 存在两个PPS ,所以pic的值在两个PPS 中会不一致。
    该值在实践过后发现其非常重要,特别是在iOS的硬解码中,初始化解码器就需要PPS值。

  2. seq_parameter_set_id标识当前PPS所引用的激活的SPS的id,sps 都只有一个,所以ID 在2个不同的PPS 中也是一致的。

  3. entropy_coding_mode_flag,熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法, CABAC 或者CAVLC。

  4. bottom_field_pic_order_in_frame_present_flag
    标识位,用于表示另外条带头中的两个语法元素delta_pic_order_cnt_bottom和delta_pic_order_cn是否存在的标识。这两个语法元素表示了某一帧的底场的POC的计算方法。

  5. num_slice_groups_minus1,表示某一帧中slice group的个数。当该值为0时,一帧中所有的slice都属于一个slice group。slice group是一帧中宏块的组合方式,定义在协议文档的3.141部分。

  6. weighted_pred_flag标识位,表示在P/SP slice中是否开启加权预测。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值