H.264文件解析与H.264编解码

本文详细分析了一个H.264编码的.mp4文件,涉及SPS与PPS解析,包括编码参数、宏块类型、量化参数等。实验还涵盖了H.264的编解码过程,探讨了不同GOP结构和码率对视频质量的影响,并生成了率失真曲线。
摘要由CSDN通过智能技术生成

数据压缩实验八
最后一次实验了,让我认认真真写一下。。。

PART1 H.264文件解析

一、实验要求

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

二、实验原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、实验内容

1. 选择文件在码流分析仪软件中打开

选择文件woman.mp4在H264visa中打开。在这里插入图片描述

2. 分析SPS和PPS

结合h[1].264(官方中文版)和JM Reference Software Manual (JVT-AE010)两个文档,对SPS和PPS进行分析。
SPS:
在这里插入图片描述

(1) profile_idc:标识当前H.264码流的profile。constraint_set0_flag ~ constraint_set5_flag是在编码的档次方面对码流增加的其他一些额外限制性条件。
在这里插入图片描述
在这里插入图片描述

  • 当前文件profile_idc = 100,查表可知码流档次为High-profile在这里插入图片描述

(2) level_idc:标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。
在这里插入图片描述
在这里插入图片描述

  • 当前文件level_idc = 31,查表可知,码流级别为3.1
    在这里插入图片描述

(3) seq_parameter_set_id:表示当前的序列参数集的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。
在这里插入图片描述

  • 当前文件seq_parameter_set_id=0在这里插入图片描述

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

  • 当前文件log2_max_frame_num_minus4 = 1,计算MaxFrameNum = 2^(log2_max_frame_num_minus4 +
    4)= 32

    在这里插入图片描述

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

  • 当前序列pic_order_cnt_type=0,采用POC mode 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 = 2,计算MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)=12
    在这里插入图片描述

(7) num_ref_frames:用于表示参考帧的最大数目。
在这里插入图片描述

  • 当前文件max_num_ref_frames=2,所以参考帧最大数目为2在这里插入图片描述

(8) gaps_in_frame_num_value_allowed_flag:标识位,说明frame_num中是否允许不连续的值。
在这里插入图片描述

  • 当前文件gaps_in_frame_num_value_allowed_flag=0。
    v

(9) pic_width_in_mbs_minus1:用于计算图像的宽度。单位为宏块个数,因此图像的实际宽度为:frame_width = 16 × (pic_width_in_mbs_minus1 + 1)

  • 当前文件pic_width_in_mbs_minus1=59,所以图像的宽为frame_width = 16 × (pic_width_in_mbs_minus1 + 1)=960在这里插入图片描述

(10) pic_height_in_map_units_minus1

使用PicHeightInMapUnits来度量视频中一帧图像的高度。PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:

PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1;

  • 当前文件pic_height_in_map_units_minus1=33,PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1 = 34在这里插入图片描述
    (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 − frame_mbs_only_flag ) * PicHeightInMapUnits = 34,图像的高度为frame_height = 16 × FrameHeightInMbs=544
    在这里插入图片描述
    (12) direct_8x8_inference_flag:标识位,用于B_Skip、B_Direct模式运动矢量的推导计算。
    在这里插入图片描述
  • 当前图像direct_8x8_inference_flag=1在这里插入图片描述

(13)mb_adaptive_frame_field_flag:标识位,说明是否采用了宏块级的帧场自适应编码。当该标识位为0时,不存在帧编码和场编码之间的切换;当标识位为1时,宏块可能在帧编码和场编码模式之间进行选择。
在这里插入图片描述

  • 当前视频mb_adaptive_frame_field_flag=0在这里插入图片描述

(14) frame_cropping_flag:标识位,说明是否需要对输出的图像帧进行裁剪。
在这里插入图片描述

  • 当前文件frame_cropping_flag=0,不存在帧剪切偏移参数在这里插入图片描述

(15) vui_parameters_present_flag:标识位,说明SPS中是否存在VUI信息。
在这里插入图片描述

  • 当前视频vui_parameters_present_flag=1在这里插入图片描述

PPS:
在这里插入图片描述
(1) pic_parameter_set_id:表示当前PPS的id。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。该值的取值范围为[0,255]。
在这里插入图片描述

  • 当前视频pic_parameter_set_id=0

(2) seq_parameter_set_id:表示当前PPS所引用的激活的SPS的id。通过这种方式,PPS中也可以取到对应SPS中的参数。该值的取值范围为[0,31]。
在这里插入图片描述

  • 当前视频seq_parameter_set_id=0

(3) entropy_coding_mode_flag:熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法。对于部分语法元素,在不同的编码配置下,选择的熵编码方式不同。例如在一个宏块语法元素中,宏块类型mb_type的语法元素描述符为“ue(v)
| ae(v)”,在baseline profile等设置下采用指数哥伦布编码,在main profile等设置下采用CABAC编码。
标识位entropy_coding_mode_flag的作用就是控制这种算法选择。当该值为0时,选择左边的算法,通常为指数哥伦布编码或者CAVLC;当该值为1时,选择右边的算法,通常为CABAC。
在这里插入图片描述

  • 当前视频entropy_coding_mode_flag=1

(4)pic_order_present_flag:标识位,用于表示另外条带头中的两个语法元素delta_pic_order_cnt_bottom和delta_pic_order_cn是否存在的标识。这两个语法元素表示了某一帧的底场的POC的计算方法。
在这里插入图片描述

  • 当前视频pic_order_present_flag=0

(5) num_slice_groups_minus1:表示某一帧中slice group的个数。当该值为0时,一帧中所有的slice都属于一个slice group。slice group是一帧中宏块的组合方式,定义在协议文档的3.141部分。
在这里插入图片描述

  • 当前视频num_slice_groups_minus1=0

(6) 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的默认值。

在这里插入图片描述

  • 当前视频num_ref_idx_l0_default_active_minus1=0、num_ref_idx_l0_default_active_minus1=0

(7) weighted_pred_flag:标识位,表示在P/SP slice中是否开启加权预测。
在这里插入图片描述

  • 当前视频weighted_pred_flag=0,不开启加权预测

(8) weighted_bipred_idc:表示在B Slice中加权预测的方法,取值范围为[0,2]。0表示默认加权预测,1表示显式加权预测,2表示隐式加权预测。
在这里插入图片描述

  • 当前视频weighted_bipred_idc=0,B条带采用默认加权预测

(9) pic_init_qp_minus26和pic_init_qs_minus26:表示初始的量化参数。实际的量化参数由该参数、slice header中的slice_qp_delta/slice_qs_delta计算得到。
在这里插入图片描述

  • 当前视频pic_init_qp_minus26=0、pic_init_qs_minus26=0

(10) chroma_qp_index_offset:用于计算色度分量的量化参数,取值范围为[-12,12]。
在这里插入图片描述

  • 当前视频chroma_qp_index_offset=0

(11) deblocking_filter_control_present_flag:标识位,用于表示Slice header中是否存在用于去块滤波器控制的信息。当该标志位为1时,slice header中包含去块滤波相应的信息;当该标识位为0时,slice header中没有相应的信息。
在这里插入图片描述

  • 当前视频deblocking_filter_control_present_flag=1,说明控制去块效应滤波器的特征的一组语法元素将出现在条带头中

(12) constrained_intra_pred_flag:若该标识为1,表示I宏块在进行帧内预测时只能使用来自I和SI类型宏块的信息;若该标识位0,表示I宏块可以使用来自Inter类型宏块的信息。
在这里插入图片描述

  • 当前视频constrained_intra_pred_flag=0,说明I宏块可以使用来自Inter类型宏块的信息

(13) redundant_pic_cnt_present_flag:标识位,用于表示Slice header中是否存在redundant_pic_cnt语法元素。当该标志位为1时,slice header中包含redundant_pic_cnt;当该标识位为0时,slice header中没有相应的信息。
在这里插入图片描述

  • 当前视频redundant_pic_cnt_present_flag=0。
3.以一个GOP为例分析

在这里插入图片描述
以第一个GOP为例分析。可以看到该GOP长度为91帧。
统计每帧所用比特数
在这里插入图片描述
I帧:
分析第一个I帧在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

没有使用到帧间编码,该帧完全使用帧内编码。每个宏块所用的平均编码比特数为119.929bits,QP(量化参数)值为18.467。

B帧:
分析第一个B帧
在这里插入图片描述
每个宏块所用的平均编码比特数为1.43bits,QP(量化参数)值为21.008。
在这里插入图片描述
在这里插入图片描述
该帧完全使用帧间编码。黄色为B_skip宏块,占87.01%。

P帧:
分析第一个P帧
在这里插入图片描述
每个宏块所用的平均编码比特数为114.328bits,QP(量化参数)值为18.612。
在这里插入图片描述
在这里插入图片描述
红色为I宏块,占0.98%,黄色为P_skip宏块,占54.90%,该帧使用了帧内编码和帧间编码。

PART2 H.264编解码

一、实验要求

  • 将自行选择或老师给的两个264文件进行解码,得到相应的YUV文件
  • 将上述两个视频序列编码为.264文件
    • 固定码率,以不同的GOP长度及形状编码:
      GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
      GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
    • 相同的GOP长度及形状,不同的码率
      例:1000kb/s, 800kb/s,400kb/s,…
  • 用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
  • 用播放器观看所生成码流的质量
  • 生成率失真曲线

二、实验内容

1.将.264文件进行解码得到相应的YUV文件

打开项目ldecode,修改decoder.cfg中的输入输出文件名
首先是第一个视频highway_qcif.264
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二个视频woman.264
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.编码为.264文件

为了简便,我们只编码30帧进行分析,帧率也设置为30。
以GOP长度为15,2B帧,码率1000kbps为例,修改encoder.cfg的信息设置参数:

输入信息:
在这里插入图片描述
输出信息:
在这里插入图片描述
GOP长度:
在这里插入图片描述
B帧数:
在这里插入图片描述
码率:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
改变参数,以固定码率,以不同的GOP长度及形状编码;
改变参数,以相同的GOP长度及形状,不同的码率编码。
生成如下文件:
在这里插入图片描述

整理成表格,得到如下结果:在这里插入图片描述

3.用码流分析软件检查

以GOP长度为15,2B帧,码率1000kbps为例,打开码流分析软件检查:
在这里插入图片描述
图中每一条代表一帧,红色为I帧,蓝色为P帧,绿色为B帧。GOP=15,2B帧,顺序为IBBPBBPBBPBBPBP,在此处由于本质上是将H.264码流进行解码分析,因此图中帧顺序为编解码顺序,也就是帧重排后的顺序,即IPBBPBBPBBPBBPB。

选择第一个IBBP查看:

I:
在这里插入图片描述
I帧中,进行帧内编码。

B:
在这里插入图片描述
在这里插入图片描述

B帧中,红色橙色为帧内(Intra)编码MB,黄色代表B-skip,蓝色则代表帧间编码MB。

P:
在这里插入图片描述
P帧中,红色橙色为帧内(Intra)编码,其大小的编码模式各有不同。蓝色为帧间(Inter)编码MB。

点与点之间的红色的线条为运动矢量。

4.用播放器观看所生成码流的质量

1. 码率1000Kbps,改变GOP结构。以第六帧为例进行查看。

GOP长度GOP形状图像
152B在这里插入图片描述
122B在这里插入图片描述
92B在这里插入图片描述
41B在这里插入图片描述
120B在这里插入图片描述
1全I在这里插入图片描述

一般来说GOP越长,视频质量越高。

2.GOP=15,2B,改变码率。以第六帧为例进行查看。

码率(bps)图像
400在这里插入图片描述
800在这里插入图片描述
1000在这里插入图片描述

码率越高,视频质量越高。

5.生成率失真曲线

在这里插入图片描述
可以看出,码率在较低范围时上升带来的视频质量提高较明显,当码率增大,质量的提升也逐渐减少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值