数据压缩实验七:H.264码流分析

一、H.264概述

1.1 H.264简介

  H.264技术是一种新的视频压缩编码标准,该标准采用了多项提高图像质量和增加压缩比的技术措施,可用于SDTV、HDTV和DVD等。H.264编码更加节省码流,H.264不仅比MPEG-4节约了50%的码率,而且还具有较强的抗误码特性,可适应丢包率高、干扰严重的无线信道中的视频传输,从而获得平稳的图像质量。H264标准使运动图像压缩技术上升到了一个更高的阶段,在较低带宽上提供高质量的图像传输是H.264的应用亮点,这正好适应了国内运营商接入网带宽还非常有限的状况。

1.2 H.264特点

  在H.264进行编码的过程中,每一帧的H图像被分为一个或多个条带(slice)进行编码。每一个条带包含多个宏块(MB,Macroblock)。宏块是H.264标准中基本的编码单元,其基本结构包含一个包含16×16个亮度像素块和两个8×8色度像素块,以及其他一些宏块头信息。

  在对一个宏块进行编码时,每一个宏块会分割成多种不同大小的子块进行预测。帧内预测采用地块大小可能为16×16或者4×4,帧间预测/运动补偿采用的块可能有7种不同的形状:16×16、16×8、8×16、8×8、8×4、4×8和4×4。相比于早期标准只能按照宏块或者半个宏块进行运动补偿,H.264所采用的这种更加细分的宏块分割方法提供了更高的预测精度和编码效率。在变换编码方面,针对预测残差数据进行的变换块大小为4×4或8×8(仅在FRExt版本支持)。相比于仅支持8×8大小的变换块的早期版本,H.264避免了变换逆变换中经常出现的失配问题。

  H.264标准中采用的熵编码方法主要有上下文自适应的变长编码CAVLC和上下文自适应的二进制算数编码CABAC,根据不同的语法元素类型指定不同的编码方式。通过这两种熵编码方式达到一种编码效率与运算复杂度之间的平衡。

  同前期标准类似,H.264的条带也具有不同的类型,其中最常用的有I条带、P条带和B条带等。另外,为了支持码流切换,在扩展档次中还定义了SI和SP片。

I条带:帧内编码条带,只包含I宏块;

P条带:单向帧间编码条带,可能包含P宏块和I宏块;

B条带:双向帧间编码条带,可能包含B宏块和I宏块;

视频编码中采用的如预测编码、变化量化、熵编码等编码工具主要工作在slice层或以下,这一层通常被称为**“视频编码层”(Video Coding Layer, VCL)。相对的,在slice以上所进行的数据和算法通常称之为“网络抽象层”(Network Abstraction Layer, NAL)。设计定义NAL层的主要意义在于提升H.264格式的视频对网络传输和数据存储的亲和性。

二、实验要求

  • 选择一个.mp4或者.264文件。
  • 在码流分析仪软件中打开该文件,从几个层次进行分析:
  1. 分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)
  2. 以一个GOP为例,分析如下信息:
  1. 每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
  2. 以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
  3. 以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
  4. 以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。

三、实验过程

3.1 用H.264Visa打开测试文件test,分析SPS和PPS

3.1.1 SPS

 

(1)profile_idc:标识当前H.264码流的profile。测试码流profile_idc = 100,所以该码流档次为High。

(2)level_idc:标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。当前码流中,level_idc = 31,因此码流的级别为3.1,可看出支持720p。

(3)seq_parameter_set_id:表示当前的序列参数集的id。通过该id值,图像参数集PPS可以引用其代表的SPS中的参数。当前码流seq_parameter_set_id=0,所以当前的SPS的id为0。

(4) log2_max_frame_num_minus4:用于计算MaxFrameNum的值。
frame_num是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。
MaxFrameNum是frame_num的上限值,计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 +4)。
当前码流log2_max_frame_num_minus4=2,即MaxFrameNum = 2^(2 +4)=64。

(5)pic_order_cnt_type:表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。
当前码流pic_order_cnt_type=0。

(6)log2_max_pic_order_cnt_lsb_minus4:用于计算MaxPicOrderCntLsb的值。该值表示POC的上限。计算方法为MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)。
当前码流log2_max_pic_order_cnt_lsb_minus4=3,所以MaxPicOrderCntLsb=2^(3+4)=128。

(7)(max_)num_ref_frames:用于表示参考帧的最大数目。
当前码流max_num_ref_frames=16,表示参考帧的最大数目为16。

(8)gaps_in_frame_num_value_allowed_flag:标识位,说明frame_num中是否允许不连续的值。当前码流gaps_in_frame_num_value_allowed_flag=0。

(9)pic_width_in_mbs_minus1:用于计算图像的宽度。
单位为宏块个数,因此图像的实际宽度为:frame_width = 16 × (pic_width_in_mbs_minus1 + 1);
当前码流pic_width_in_mbs_minus1=39,所以frame_width = 16 × (39 + 1)=640。

(10)pic_height_in_map_units_minus1:使用PicHeightInMapUnits来度量视频中一帧图像的高度。PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1;
当前码流pic_height_in_map_units_minus1=22,所以PicHeightInMapUnits = 22 + 1=23。

(11) frame_mbs_only_flag:标识位,说明宏块的编码方式。
当该标识位为0时,宏块可能为帧编码或场编码;该标识位为1时,所有宏块都采用帧编码。
根据该标识位取值不同,PicHeightInMapUnits的含义也不同,为0时表示一场数据按宏块计算的高度,为1时表示一帧数据按宏块计算的高度。按照宏块计算的图像实际高度FrameHeightInMbs的计算方法为:
FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits
当前码流frame_mbs_only_flag=1,说明所有宏块都采用帧编码,且FrameHeightInMbs= ( 2 − 1 ) * 23=23。图像实际高度为:16*23=368。

所以可得出图像分辨率为640*368。

(12)direct_8x8_inference_flag:标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。

(13)frame_cropping_flag:标识位,说明是否需要对输出的图像帧进行裁剪。

(14) vui_parameters_present_flag:标识位,说明SPS中是否存在VUI信息。

3.1.2 PPS

(1) pic_parameter_set_id: 标识在条带头中提到的图像参数集。

变量 pic_parameter_set_id 的值应该在 0 到 255 的范围内(包括 0 和 255)。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。


(2) seq_parameter_set_id: 表示当前PPS所引用的激活的SPS的id。

通过这种方式,PPS中也可以取到对应SPS中的参数。 变量 seq_parameter_set_id 的值应该在 0 到 31 的范围内(包括 0 和 31)


(3) entropy_coding_mode_flag:用于选取语法元素的熵编码方式,在语法表中由两个标识符代表,具体如下:

如果entropy_coding_mode_flag 等于0,那么采用Exp-Golomb编码或CAVLC;如果entropy_coding_mode_flag 等于1,就采用CABAC。
pic_order_present_flag

等于 1 表示与图像顺序数有关的语法元素将出现于条带头中,等于 0 表示条带头中不会出现与图像顺序数有关的语法元素。


(4) num_slice_groups_minus1:表示一个图像中的条带组数(slice group) num_slice_groups_minus1 等于 0 时,图像中所有的条带属于同一个条带组。


(5) num_ref_idx_l0_active_minus1、num_ref_idx_l1_active_minus1:

num_ref_idx_l0_active_minus1 表示参考图像列表 0 的最大参考索引号,该索引号将用来在一幅图像中num_ref_idx_active_override_flag 等于 0 的条带使用列表 0 预测时,解码该图像的这些条带。num_ref_idx_l1_active_minus1 与 num_ref_idx_l0_active_minus1 具有同样的定义,只是分别用 11 和列表 1取代 10 和列表 0。


(6) weighted_pred_flag: 等于 0 表示加权的预测不应用于 P 和 SP 条带。

weighted_pred_flag 等于 1 表示在 P 和 SP条带中应使用加权的预测。


(7) weighted_bipred_idc:等于 0 表示 B 条带应该采用默认的加权预测。

weighted_bipred_idc 等于 1 表示 B 条带应该 采 用具体指 明 的 加 权 预 测 。 weighted_bipred_idc 等 于 2 表 示 B 条 带 应 该 采 用 隐 含 的 加 权 预 测 。


(8) pic_init_qp_minus26、pic_init_qs_minus26:表示初始的量化参数。

实际的量化参数由该参数、slice header中的slice_qp_delta/slice_qs_delta计算得到。


(9) chroma_qp_index_offset:用于计算色度分量的量化参数,取值范围为[-12,12]。


(10) deblocking_filter_control_present_flag:等于 1 表示控制去块效应滤波器的特征的一组语法元素将出现在条带头中,等于 0 表示控制去块效应滤波器的特征的一组语法元素不会出现在条带头中


(11) constrained_intra_pred_flag:等于 0 表示帧内预测允许使用残余数据,且使用帧内宏块预测模式编码的宏块 的预测可以使用帧间宏块预测模式编码的相邻宏块的解码样值;等于 1 表示受限制的帧内预测,在这种情况下,使用帧内宏块预测模式编码的宏块的预测仅使用残余数据和来自 I 或 SI 宏块类型的解码样值。


(12) redundant_pic_cnt_present_flag:标识位,用于表示Slice header中是否存在redundant_pic_cnt语法元素。

当该标志位为1时,slice header中包含redundant_pic_cnt;当该标识位为0时,slice header中没有相应的信息。


(13) transform_8x8_mode_flag:等 于 1 表 示 8x8 变 换 解 码过程可能正 在使用,等于 0 表示未使用 8x8 变换解码过程。

当 transform_8x8_mode_flag 不存在时,默认其值为 0。


(14) pic_scaling_matrix_present_flag:等于 1 表示存在用来修改在序列参数集中指定的缩放比例列表的参数,等于 0 表示用于该图像中的缩放比例列表应等于由序列参数集规定的。当 pic_scaling_matrix_present_flag 不存在时,默认其值为 0。

3.2 分析一个GOP

3.2.1 GOP概述

GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。

3.2.2 选择一个GOP

打开eseye软件,导入南京博物馆.mp4,得到如上图的GOP结构。上图是第二个GOP的I帧,也就是第二个GOP的起始帧。

上图是第三个GOP的帧,也就是第三个GOP的起始帧。由此两个I帧的序号得到,GOP的长度为30。

 导出每个帧的编码比特数如下,其中可以看出每帧的类型和大小,红色为I帧,蓝色为P帧,绿色为B帧,从图中可看出所用比特率I帧>P帧>B帧。

3.3 各帧分析

3.3.1 I帧

 

可以看到该帧全部为I帧内编码帧。编码时多采用8 × 8 、16 × 16 的宏块,细节部分也有采用4 × 4 的宏块。

 3.3.2 P帧

可以看到该帧有帧内编码,也有帧间编码,QP值为23.333.

3.3.3 B帧

可以看到B帧中QP值为24.333,是双向预测编码。

 

 

 

 

 

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值