MP4/H.264码流分析实验

1.分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)

H.264码流结构与MPEG-2的嵌入式树状码流结构不同,其每一个数据单元为NAL,每个NAL包含头部和payload。然后将sequence序列信息和picture图片信息分别封装在SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)中。

(1)SPS(SequenceParameterSet):序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集(PPS)中。

  • profile_idc:标识H.264文件的profile。profile分为Baseline,Main,Extended等,主要用来规定编码时是否采用某些特性。本文件为100,是High Profile。

     
  • constraint_set_flag:constraint_set0_flag ~ constraint_set5_flag是在编码的档次方面对码流增加的其他一些额外限制性条件。
  • reserved_zero_4bits:四个0bit的保留位。
  • level_idc:本H.264文件遵循的level,level主要规定了每秒最多能处理多少个宏块,最大的帧大小,最大的解码缓存,最大比特率等性能信息,码流所遵从的level由level_idc指定。本文件为31,对应码流级别为3.1。
  • seq_parameter_set_id:表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。
  • log2_max_frame_num_minus4:用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4+4)。MaxFrameNum是frame_num的上限值,frame_num是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。
  • pic_order_cnt_type:表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。
  • num_ref_frames:用于表示参考帧的数目。
  • gaps_in_frame_num_value_allowed_flag:标识位,说明frame_num中是否允许不连续的值。
  • pic_width_in_mbs_minus1:用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:frame_width = 16 × (pic_width_in_mbs_minus1 + 1)。
  • pic_height_in_map_units_minus1:使用PicHeightInMapUnits来度量视频中一帧图像的高度。PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:PicHeightInMapUnits =pic_height_in_map_units_minus1 + 1。
  • frame_mbs_only_flag:标识位,说明宏块的编码方式。当该标识位为0时,宏块可能为帧编码或场编码;该标识位为1时,所有宏块都采用帧编码。根据该标识位取值不同,PicHeightInMapUnits的含义也不同,为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。按照宏块计算的图像实际高度FrameHeightInMbs的计算方法为:FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits
  • direct_8x8_inference_flag:标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。
  • frame_cropping_flag:标识位,说明是否需要对输出的图像帧进行裁剪。本文件为0,即不需要进行裁剪。
  • vui_parameters_present_flag:标识位,说明SPS中是否存在VUI信息。本文件为1,即存在VUI信息。

 (2)PPS(Picture Paramater Set):图像参数集。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。

  • pic_parameter_set_id:表示当前PPS的id。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。该值的取值范围为[0,255]。
  • seq_parameter_set_id:表示当前PPS所引用的激活的SPS的id。通过这种方式,PPS中也可以取到对应SPS中的参数。该值的取值范围为[0,31]。
  • entropy_coding_mode_flag:熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法。对于部分语法元素,在不同的编码配置下,选择的熵编码方式不同。作用就是控制这种算法选择。当该值为0时,选择左边的算法,通常为指数哥伦布编码或者CAVLC;当该值为1时,选择右边的算法,通常为CABAC。
  • num_slice_groups_minus1:表示某一帧中slice group的个数。当该值为0时,一帧中所有的slice都属于一个slice group。slice group是一帧中宏块的组合方式,定义在协议文档的3.141部分。
  • num_ref_idx_l0_default_active_minus1、num_ref_idx_l0_default_active_minus1:表示当Slice Header中的num_ref_idx_active_override_flag标识位为0时,P/SP/B slice的语法元素num_ref_idx_l0_active_minus1和num_ref_idx_l1_active_minus1的默认值。
  • weighted_pred_flag:标识位,表示在P/SP slice中是否开启加权预测。
  • weighted_bipred_idc:表示在B Slice中加权预测的方法,取值范围为[0,2]。0表示默认加权预测,1表示显式加权预测,2表示隐式加权预测。
  • pic_init_qp_minus26和pic_init_qs_minus26:表示初始的量化参数。实际的量化参数由该参数、slice header中的slice_qp_delta/slice_qs_delta计算得到。
  • chroma_qp_index_offset:用于计算色度分量的量化参数,取值范围为[-12,12]。
  • deblocking_filter_control_present_flag:标识位,用于表示Slice header中是否存在用于去块滤波器控制的信息。当该标志位为1时,slice header中包含去块滤波相应的信息;当该标识位为0时,slice header中没有相应的信息。
  • constrained_intra_pred_flag:若该标识为1,表示I宏块在进行帧内预测时只能使用来自I和SI类型宏块的信息;若该标识位0,表示I宏块可以使用来自Inter类型宏块的信息。
  • redundant_pic_cnt_present_flag:标识位,用于表示Slice header中是否存在redundant_pic_cnt语法元素。当该标志位为1时,slice header中包含redundant_pic_cnt;当该标识位为0时,slice header中没有相应的信息。

(3)码流分析仪:

 可以在该界面看到黑色光标所在帧的GOP序号、帧类型、帧大小、时间、偏移量、在整个序列中的帧序号(编码序号)和最终展示时的帧序号。

 可以看到本文件的分辨率为640×360,纵横比为40:23,总帧数为1352,以及帧最大的大小,所有帧的平均大小、最大最小及平均码率等信息。

2.以一个GOP为例,分析如下信息:

(1)每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。

通过码流分析仪导出所有帧的帧号、类型、偏移量、比特数、时间等信息。以第一个GOP为例,该GOP有250帧,其以图像帧号为横坐标、每帧所用比特数为纵坐标的曲线图为:

(2)以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。

第一个I帧共有920个宏块,为帧内预测编码帧,没有参考帧。可以看到其在背景这种颜色变化不大的地方大多采用帧内16×16预测,但亮度和色度cbp值不同,在背景与人物衔接的边缘,宏块会更加细节,为I帧4×4预测。每个宏块的编码细节可以从下图看到:

本帧采用15种不同的编码方式,如下表。每种不同的编码格式所占比例可以按其个数(count)除以总个数(920)来计算。

(3)以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。

第一个P帧有前向预测参考帧,蓝色为采用前向预测编码的宏块,黄色为P_skip块,即这一帧的数据内容与前一帧相同,跳过不编码。 

该图中绿色为P帧的宏块类型,粉色为I帧的帧内编码类型。随机选中一个绿色的宏块,可以看到如下信息:

 本帧内有12中宏块编码格式,如下:

(4)以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。

 上图中蓝色的细节宏块编码类型基本为B_skip,即跳过不编码的宏块。空白宏块编码类型不同,随机选中宏块信息如下:

本B帧为双向预测编码帧,前后向的帧都有参考。其宏块有920个,编码类型有7种,大多数都为跳过不编码的类型。其余为帧间预测编码宏块。

其中宏块的帧间预测运动矢量如下图:

 

 参考资料:

H264码流中SPS PPS详解 - 简书 (jianshu.com)宏块层的mb_type_david412306524的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值