[实验七] H.264调试

一、H.264概述

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。
H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。

H264标准的主要特点如下:

  1. 更高的编码效率:同H.263等标准的特率效率相比,能够平均节省大于50%的码率。
  2. 高质量的视频画面:H.264能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输是H.264的应用亮点。
  3. 提高网络适应能力:H.264可以工作在实时通信应用(如视频会议)低延时模式下,也可以工作在没有延时的视频存储或视频流服务器中。
  4. 采用混合编码结构:同H.263相同,H.264也使用采用DCT变换编码加DPCM的差分编码的混合编码结构,还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4x4二维整数变换等新的编码方式,提高了编码效率。
  5. H.264的编码选项较少:在H.263中编码时往往需要设置相当多选项,增加了编码的难度,而H.264做到了力求简洁的“回归基本”,降低了编码时复杂度。
  6. H.264可以应用在不同场合:H.264可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。
  7. 错误恢复功能:H.264提供了解决网络传输包丢失的问题的工具,适用于在高误码率传输的无线网络中传输视频数据。
  8. 较高的复杂度:264性能的改进是以增加复杂性为代价而获得的。据估计,H.264编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。

二、文件解析

本实验中所用的测试视频为test.mp4,在码流分析仪中打开如下:

2.1 SPS文件解析

SPS即H.264文件中的序列参数集(sequence parameter set),是H.264中的一个语法结构,包含应用于 0 个或多个完整编码视频序列的语法元素,由条带头中的语法元素 pic_parameter_set_id 确定所引用的图像参数集,由图像参数集中的语法元素 seq_parameter_set_id 确定所引用的序列参数集。

本测试文件test.mp4的SPS内容如下:

2.1.1 profile_idc

profile_idc是比特流所遵守的配置,测试视频的profile_idc为100即比特流遵从高级简表

2.1.2 constraint_set0_flag

当constraint_set0_flag 等于 0 时是指该比特流可以遵从也可以不遵从基准简表中的所有规定。

2.1.3 constraint_set1_flag

当constraint_set0_flag 等于 0 时是指该比特流可以遵从也可以不遵从主要简表中的所有规定。

2.1.4 constraint_set2_flag

当constraint_set0_flag 等于 0 时是指该比特流可以遵从也可以不遵从扩展简表中的所有规定。

2.1.5 constraint_set3_flag

  • 如果 profile_idc等于66、77或88并且level_ idc等于 11,constraint_set3_flag 等于 1 是指该比特流遵从H.264简表与级别中对级别1b的所有规定,constraint_set3_flag等于0是指该比特流可以遵从也可以不遵从H.264简表与级别中有关1b级别的所有规定。
  • 否则(profile_idc等于100、110、122或144或level_ idc不等于 11),constraint_set3_flag 等于1留作未来使用。根据H.264标准的规定,当profile_idc等于100、110、122或144或level_ idc不 等于 11时,比特流中constraint_set3_flag 应等于0。当profile_idc等于100、110、122或144或level_ idc不等于11时,遵从H.264标准的解码器将忽略constraint_set3_flag 的值。

2.1.6 reserved_zero_4bits

应等于0。reserved_zero_4bits 的其他取值将由 ITU-T | ISO/IEC 未来规定。解码器将忽略 reserved_zero_4bits 的值。

2.1.7 level_idc

是比特流所遵守的级别。

2.1.8 seq_parameter_set_id

seq_parameter_set_id 用于识别图像参数集所指的序列参数集。seq_parameter_set_id 的值应在 0-31 的范围内,包括 0 和 31。

2.1.9 chroma_format_idc

chroma_format_idc 是指与亮度取样对应的色度取样。chroma_format_idc 的值应该在 0 到 3 的范围内(包括 0 和 3)。当 chroma_format_idc 不存在时,应推断其值为 1(4:2:0 的色度格式)。

2.1.10 bit_depth_luma_minus8

bit_depth_luma_minus8 是指亮度队列样值的比特深度以及亮度量化参数范围的取值偏移 QpBdOffsetY ,如下所示:

 

当 bit_depth_luma_minus8 不存在时,应推定其值为 0。bit_depth_luma_minus8 取值范围应该在 0 到 4 之间 (包括 0 和 4)。

2.1.11 bit_depth_chroma_minus8

bit_depth_chroma_minus8 是指色度队列样值的比特深度以及色度量化参数范围的取值偏移 QpBdOffsetC , 如下所示:

bit_depth_chroma_minus8 不存在时,应推定其值为 0。bit_depth_chroma_minus8 取值范围应该在 0 到 4 之 间(包括 0 和 4)。

2.1.12 qpprime_y_zero_transform_bypass_flag

  • qpprime_y_zero_transform_bypass_flag 等于 1 是指当 QP'Y 等于 0 时变换系数解码过程的变换旁路操作和图 像构建过程将会在去块效应滤波过程之前执行。
  • qpprime_y_zero_transform_bypass_flag 等于 0 是指 变 换 系数解码过程和图像 构建过程在去块 效应滤波过程之前执行而不使用变换旁路操作。当 qpprime_y_zero_transform_bypass_flag 没有特别指定时,应推定其值为0。

2.1.13 seq_scaling_matrix_present_flag

seq_scaling_matrix_present_flag 等 于 1 表示存在 i=0..7 的 标 志 seq_scaling_list_present_flag[i] 。 seq_scaling_matrix_present_flag 等于 0 则表示不存在这些标志并且由 Flat_4x4_16 表示的序列级别的缩放比例列表 应被推断出来(对应 i=0..5),由 Flat_8x8_16 表示的序列级别的缩放比例列表应被推断出来(对应 i=6..7)。当 seq_scaling_matrix_present_flag 没有特别指定时,应推定其值为 0。缩放比例列表 Flat_4x4_16 和 Flat_8x8_16 规定如下:

2.1.14 log2_max_frame_num_minus4

log2_max_frame_num_minus4 按下列公式可得出与 frame_num 相关的变量 MaxFrameNum 的值

2.1.15 pic_order_cnt_type

pic_order_cnt_type 是指解码图像顺序的计数方法,取值范围是 0 到 2(包括 0 和 2)。

2.1.16 log2_max_pic_order_cnt_lsb_minus4

log2_max_pic_order_cnt_lsb_minus4表示用于图像顺序数解码过程中的变量 MaxPicOrderCntLsb 的值,公式如下:

2.1.17  num_ref_frames

num_ref_frames规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。num_ref_frames 字段也决定了滑动窗口操作的大小。num_ref_frames 的取值范围应该在 0 到 MaxDpbSize 范围内,包括 0 和MaxDpbSize 。

2.1.18 gaps_in_frame_num_value_allowed_flag

表示frame_num 的允许值以及在 frame_num 值之间存在推测的差异的情况下进行的解码过程。

2.1.19 pic_width_in_mbs_minus1

pic_width_in_mbs_minus1 加 1 是指以宏块为单元的每个解码图像的宽度。

以宏块为单元的图像宽度变量由下列公式可得:

亮度分量的图像宽度变量由下列公式得出:

色度分量的图像宽度变量由下列公式得出:

2.1.20 pic_height_in_map_units_minus1

pic_height_in_map_units_minus1 加 1 表示以条带组映射为单位的一个解码帧或场的高度。 变量 PicHeightInMapUnits 和 PicSizeInMapUnits 由下列公式得出:

 2.1.21 frame_mbs_only_flag

frame_mbs_only_flag 等于 0 表示编码视频序列的编码图像可能是编码场或编码帧。frame_mbs_only_flag 等于 1 表示编码视频序列的每个编码图像都是一个仅包含帧宏块的编码帧。

 2.1.22 direct_8x8_inference_flag

direct_8x8_inference_flag 表示 B_Skip、B_Direct_16x16 和 B_Direct_8x8 亮度运动矢量 的计算过程使用的方法。当 frame_mbs_only_flag 等于 0 时 direct_8x8_inference_flag 应等于 1。

2.1.23 frame_cropping_flag

frame_cropping_flag 等于 1 表示帧剪切偏移参数遵从视频序列参数集中的下一个值。frame_cropping_flag 等 于 0 表示不存在帧剪切偏移参数。

2.1.24 vui_parameters_present_flag

vui_parameters_present_flag 等于 1 表示存在 如 附 录 E 提 到 的 vui_parameters( ) 语法结构 。 vui_parameters_present_flag 等于 0 表示不存在如附录 E 提到的 vui_parameters( ) 语法结构。

2.2 PPS文件解析 

PPS即H.264文件中的图像参数集(picture parameter set),是一个语法结构,包含应用于零个或多个编码图像的语法元 素,由每个条带头部中的语法元素 pic_parameter_set_id 确定。

本测试文件test.mp4的PPS内容如下:

2.2.1 pic_parameter_set_id

pic_parameter_set_id 标识在条带头中提到的图像参数集。变量 pic_parameter_set_id 的值应该在 0 到 255 的 范围内(包括 0 和 255)。

2.2.2 seq_parameter_set_id

seq_parameter_set_id 是指活动的序列参数集。变量 seq_parameter_set_id 的值应该在 0 到 31 的范围内(包 括 0 和 31)。

2.2.3 entropy_coding_mode_flag

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

  • 如果entropy_coding_mode_flag 等于0,那么采用语法表中左边的描述符所指定的方法
  • 否则(entropy_coding_mode_flag 等于1),就采用语法表中右边的描述符所指定的方法

2.2.4 pic_order_present_flag

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

2.2.5 num_slice_groups_minus1

num_slice_groups_minus1 加 1 表示一个图像中的条带组数。当 num_slice_groups_minus1 等于 0 时,图像中 所有的条带属于同一个条带组。num_slice_groups_minus1 的允许取值范围在附件 A 中给出。

2.2.6 num_ref_idx_l0_active_minus1

num_ref_idx_l0_active_minus1 表示参考图像列表 0 的最大参考索引号,该索引号将用来在一幅图像中 num_ref_idx_active_override_flag 等于 0 的条带使用列表 0 预测时,解码该图像的这些条带。当 MbaffFrameFlag 等于 1 时,num_ref_idx_l0_active_minus1 是帧宏块解码的最大索引号值,而 2 * num_ref_idx_l0_active_minus1 + 1 是场宏块解码的最大索引号值。num_ref_idx_l0_active_minus1 的值应该在 0 到 31 的范围内(包括 0 和 31)。

2.2.7 num_ref_idx_l1_active_minus1

num_ref_idx_l1_active_minus1 与 num_ref_idx_l0_active_minus1 具有同样的定义,只是分别用 11 和列表 1 取代 10 和列表 0。

2.2.8 weighted_pred_flag

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

2.2.9 weighted_bipred_idc

weighted_bipred_idc 等于 0 表示 B 条带应该采用默认的加权预测。weighted_bipred_idc 等于 1 表示 B 条带应 该 采 用具体指 明 的 加 权 预 测 。 weighted_bipred_idc 等 于 2 表 示 B 条 带 应 该 采 用 隐 含 的 加 权 预 测 。 weighted_bipred_idc 的值应该在 0 到 2 之间(包括 0 和 2)。

2.2.10 pic_init_qp_minus26

pic_init_qp_minus26 表示每个条带的 SliceQPY 初始值减 26。当解码非 0 值的 slice_qp_delta 时,该初始值在 条带层被修正,并且在宏块层解码非 0 值的 mb_qp_delta 时进一步被修正。pic_init_qp_minus26 的值应该在- (26 + QpBdOffsetY ) 到 +25 之间(包括边界值)。

2.2.11 pic_init_qs_minus26

pic_init_qs_minus26 表示在 SP 或 SI 条带中的所有宏块的 SliceQSY 初始值减 26。当解码非 0 值的 slice_qs_delta 时,该初始值在条带层被修正。pic_init_qs_minus26 的值应该在-26 到 +25 之间(包括边界值)。

2.2.12 chroma_qp_index_offset

chroma_qp_index_offset 表示为在 QPC 值的表格中寻找 Cb 色度分量而应加到参数 QPY 和 QSY 上的偏移。 chroma_qp_index_offset 的值应在-12 到 +12 范围内(包括边界值)。

2.2.13 deblocking_filter_control_present_flag

deblocking_filter_control_present_flag 等于 1 表示控制去块效应滤波器的特征的一组语法元素将出现在条带 头中。deblocking_filter_control_present_flag 等于 0 表示控制去块效应滤波器的特征的一组语法元素不会出现在条 带头中,并且它们的推定值将会生效。

2.2.14 constrained_intra_pred_flag

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

2.2.15 redundant_pic_cnt_present_flag

redundant_pic_cnt_present_flag 等于 0 表示 redundant_pic_cnt 语法元素不会在条带头、图像参数集中指明 (直接或与相应的数据分割块 A 关联)的数据分割块 B 和数据分割块 C 中出现。redundant_pic_cnt_present_flag 等 于 1 表示 redundant_pic_cnt 语法元素将出现在条带头、图像参数集中指明(直接或与相应的数据分割块 A 关联) 的数据分割块 B 和数据分割块 C 中。

2.2.16 transform_8x8_mode_flag

transform_8x8_mode_flag 等 于 1 表 示 8x8 变 换 解 码过程可能 正 在使用。 transform_8x8_mode_flag 等于 0 表示未使用 8x8 变换解码过程。当 transform_8x8_mode_flag 不存在时,默认其值 为 0。

2.2.17 pic_scaling_matrix_present_flag

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

三、GOP分析

在ESEyE软件中打开测试文件南京博物馆.mp4

 其中红色条为I帧,蓝色条为P帧,绿色条为B帧,在下方的Frame Info区域中可以看到该I帧的Size为236749,位于GOP0中即第一个GOP。

以第三个GOP为例,该GOP共有30帧,第一个I帧随后是一个P帧,由于利用前面的I帧作为预测,大小比原来的I帧更小,为75678。该帧的Number in Stream为61不同于Number in Display为62是因为该P帧本来应该在第62帧的位置播放,但第61帧为B帧需要第62帧P帧作为预测,因此第62帧P帧应该在第61帧前解码,所以该P帧Number in Stream不同于Number in Display

随后的B帧由于使用了双向预测,大小比P帧更小,仅为1113

导出每一帧的类型、大小、时间如下 

绘制每一帧所用比特数如下

 

 可以看到I帧的大小最大,P帧其次,B帧最小

 

由于南京博物馆.mp4文件格式存在问题无法使用码流分析仪打开,因此后续实验继续使用测试视频test.mp4

3.1 I帧

以第1帧为例

 该帧为帧内编码帧,所有宏块都是帧内编码(Intra)仅宏块尺寸有所差异,各类宏块个数如下,可以看到该帧共有920个I宏块

3.2 P帧

以第2帧为例

该帧为前向预测帧P帧,其中的部分宏块使用了预测,也有部分宏块为帧内编码,各类宏块个数如下,可以看到该帧中共有91个I宏块和829个P宏块

添加运动矢量,由于该帧和上一帧的差异不大,因此运动矢量信息也多为0

3.2 B帧

 以第3帧为例

该帧为双向预测帧B帧,所有宏块都用了预测,各类宏块个数如下,可以看到该帧中共有920个B宏块

添加运动矢量如下

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值