资讯详情

H.264码流分析

H.264国际标准化组织(ISO)与国际电信联盟(ITU)共同提出的继MPEG4后新一代数字视频压缩格式。H.264是ITU-T以H.26x该系列是名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG联合视频组(活动图像编码专家组)(JVT:joint video team)数字视频编码标准的开发。

H.264标准的主要目标是在相同的带宽下提供更好的图像质量,而不是其他现有的视频编码标准。通过该标准,相同图像质量下的压缩效率高于以前的标准(MPEG2)增加了2倍左右

自己打开一个mp4或者264

1.分析SPS和PPS给出参数值的主要信息。(如分辨率、帧率、GOP结构等等)

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

(1)每个图像帧的类型和编码比特数,QP值;以图像帧号为横坐标,每帧使用的比特数为纵坐标画曲线图;以图像帧号为横坐标,每帧使用QP为纵坐标画曲线图。

(2)根据帧图像的空间特性,分析每个宏块使用的编码类型及其比例。

(3)根据帧图像的空间和时间特性,分析每个宏块使用的编码类型及其比例。

(4)根据帧图像的空间和时间特性,分析每个宏块使用的编码类型及其比例。

首先打开文件

  • SPS的NAL Unit通常位于整个码流的起始位置,NAL Unit Type = 7

  • SPS中间保存了一组编码视频序列(Coded video sequence)整体参数。所谓的编码视频序列是由编码后的原始视频的像素数据组成的序列。每帧编码后数据所依赖的参数保存在图像参数集中。

标识当前H.264码流的profile。H.264定义了三个常用等级profile:

  • 基准档次:baseline profile;66
  • 主要档次:main profile;77
  • 扩展档次:extended profile;88

  • 新标准还包括High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra等等,每一种都是不同的profile_idc表示

这是100,说明是High

constraint_set0_flag ~ constraint_set5_flag在编码等级方面,代码流增加的其他限制性条件

识别当前码流Level。编码的Level在某些条件下,定义了最大的视频分辨率、最大的视频帧率和其他参数,以及代码流所遵循的level由level_idc指定。

图中码流级别为31

表示当前的序列参数集的id。通过该id值,图像参数集pps可引用其代表sps中的参数

用于计算MaxFrameNum值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 4)。MaxFrameNum是frame_num的上限值,frame_num它是图像序号的表示方法,常用作帧间编码中的参考帧标记。

图中MaxFrameNum=2^6=64

表示解码picture order count(POC)的方法。POC它是测量图像序号的另一种方式frame_num有不同的计算方法。语法元素的值为0、1或2。

用于表示参考帧的最大数量

标识位,说明frame_num不连续值是否允许不连续值?

用于计算图像的宽度。单位为宏块数,因此图像的实际宽度为:

frame_width = 16 × (pic_width_in_mbs_minus1 1);

用于计算图像的高度。单位为宏块数,因此图像的实际高度为:

frame_height= 16 × (pic_height_in_map_minus1 1);

现在我们可以得到分辨率信息,宽:16*(1 36)=640

高:16*(1 22)=368

所以分辨率640*368,与下图一致

标识位,说明宏块的编码方式。当标识位为0时,宏块可以是帧编码或场编码;当标识位为1时,所有宏块都使用帧编码。根据标识位的不同值,PicHeightInMapUnits也有不同的含义,即0时数据按宏块计算,1时数据按宏块计算。

根据宏块计算的图像的实际高度FrameHeightInMbs计算方法如下:FrameHeightInMbs = ( 2 ? frame_mbs_only_flag ) * PicHeightInMapUnits

标识位,用于B_Skip、B_Direct模式运动矢量的推导计算

标识位表示是否需要切割输出的图像帧

标识位,说明SPS中是否存在VUI信息

time_scale 和num_unis_in_tick帧率可以计算

fps=time_scale/num_units_in_tick

这里有一点问题。time_scale是96,num_units_in_tick是1,相除应该是96,但文件的帧率实际上应该是24,目前还不清楚为什么会这样


PPS信息即Picture Paramater Set,图像参数集也是表示序列图像信息的数据。SPS文件头中共同包装信息

PPS NAL Unit的nal_unit_type值为8

声明当前PPS的id。

表示当前PPS引用的激活SP的id。通过这种方式,PPS中也可以取到对应SPS中的参数。该值的取值范围为[0,31]

熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法。对于部分语法元素,在不同的编码配置下,选择的熵编码方式不同。例如在一个宏块语法元素中,宏块类型mb_type的语法元素描述符为“ue(v) | ae(v)”,在baseline profile等设置下采用指数哥伦布编码,在main profile等设置下采用CABAC编码。

标识位entropy_coding_mode_flag的作用就是控制这种算法选择。当该值为0时,选择左边的算法,通常为指数哥伦布编码或者CAVLC;当该值为1时,选择右边的算法,通常为CABAC

 pic_order_present_flag等于1表示在切片头中图像顺序值存在,pic_order_present_flag为0表示切片头中的图像顺序值不存在

num_slice_groups_minus1加上1表示一个图像中的切片组数目.当num_slice_groups_minus1为0时,图象所有的切片属于同一组

指明了参考图像列表0中的最大参考索引值,它被用来解码图像的每一个切片,列表0在num_ref_idx_active_override_flag值为0的时候被使用.当MbaffFrameFlag值为1时,num_ref_idx_l0_active_minus1是解码帧宏块的最大索引值,而2 * num_ref_idx_10_active_minus1 + 1是解码场宏块的最大索引值.num_ref_idx_l0_active_minus1的取值为0到31.

与num_ref_idx_l0_active_minus1有相同的语义,只不过它是针对列表1来说的

weighted_pred_flag=0表示加权预测在P和SP切片中没有被使用 weighted_pred_flag=1表示加权预测在P和SP切片中有使用

本例中是1,代表加权预测在P和SP中有使用

weighted_bipred_idc=0表示默认的加权预测被应用到B切片中. weighted_bipred_idc=1表示外部的加权预测被应用到B切片中. weighted_bipred_idc=2表示内部的加权预测被应用到B切片中. weighted_bipred_idc的取值为0,1,2.

本例为2,代表内部加权预测应用到B切片

指出了对于每个切片来说的SliceQPY的初始值减26.初始值在切片层中当非0的slice_qp_delta被解码后时改变,在非0的mb_qp_delta值被在宏块层解码时再次被改变.pic_init_qp_minus26应该取-26到+25.

pic_init_qs_minus26指出了对于SP或SI切片中的SliceQSY的被始值减26.这个初始值在切片层中当一个非0的slice_qs_delta被解码的时候被修改.pic_init_qs_minus26的取值为-26到25

chroma_qp_index_offset表示在查QPC表时,对于QPY和QSY应该加上的偏移量.chroma_qp_index_offset取值为-12到12

deblocking_filter_control_present_flag=1表示在切片头处用来控制解块滤波的特征值是存在的. deblocking_filter_control_present_flag=0表示在切片头处用来控制解块滤波的特征值是不存在的

constrained_intra_pred_flag=0表示在帧内预测的时候允许剩余数据和邻近宏块解码采样. constrained_intra_pred_flag=1表示在受限的帧内预测,对宏块预测中使用帧内宏块预测模式只使用剩余数据和从I和SI宏块类型中的解码采样值.

redundant_pic_cnt_present_flag=0表示redundant_pic_cnt在切片头中,数据分区B和数据分区C中不存在. redundant_pic_cnt_present_flag=1表示redundant_pic_cnt在所有切片头中,数据分区B和数据分区C中存在

用 Elecard StreamEye Tools 软件打开

红色为 I 帧,蓝色为 P 帧,绿色为 B 帧

GOP的顺序是从0开始的,每一个GOP开始必然是I帧,如图中的红色长条。I帧在流中的顺序和它的显示顺序一样

所以我们不难推出每一个GOP长度,第二个I帧红色长条num是250,第三个是500,所以第一个和第二个GOP长250

码流帧序和显示帧序可能不一样,如南京博物馆一个p帧

,这是因为

将文件保存在csv文件中

以第一个GOP为例子,以图像帧号为横坐标、每帧所用比特数为纵坐标画出图 


I帧

 可知,宏块类型有16*16,8*8,4*4的,16*16有920-539=381个。图中衣服和背景等交界处,宏块分得更细的4*4,下面取三个观察信息

 


P帧

 

 运动矢量如下

图中大多数都是绿色的P类宏块,粉红色的I类宏块较少,并且多了16*8和8*16类型的,如下图

,p帧多出来skip宏块说明参考帧有相同宏块,这样可以提高压缩效率


B帧

双向预测编码帧

 

 如图可知,B帧大多数都是B_Skip宏块,图中粉红色的I类宏块也有,但很少

运动矢量如下

标签: 重量变送器qsy7105

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台