Lab8-1 H.264编码实验——软件分析
一、实验要求
选择一个.mp4或者.264文件,在码流分析仪软件中打开该文件,从下面几个层次进行分析:
- 分析SPS和PPS里都包含哪些主要的信息,给出参数值。
- 以一个GOP为例,分析如下信息:
- 每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
- 以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
- 以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
- 以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
二、实验过程
【写在前面】
软件说明:H264Visa码流分析软件是以PTS显示时间标记为各帧图像进行排序;而ESEyE码流分析软件是以DTS解码时间标记为x轴进行排序与作图。由于H.264的PTS与DTS并不相等,所以在下文进行码流分析时需格外注意两种软件排序方面的区别。
1、分析SPS和PPS所包含的主要信息
使用H264Visa码流分析软件打开准备的pulada.mp4文件,如图。
该视频文件的SPS和PPS内容如下:
SPS:
PPS:
从上面可以得到一些关于视频的重要信息,如:
- num_ref_frames最大参考帧数目:4
- pic_width_in_mbs_minus1用于计算图像宽度(亮度分量以像素为单位):frame_width = 16 × (39 + 1) = 640
- pic_height_in_map_units_minus1用于计算图像高度(以 map_unit 为单位):PicHeightInMapUnits = 22 + 1 = 23
- frame_mbs_only_flag说明宏块的编码方式:1表示所有宏块都采用帧编码,同时也表示一帧数据按宏块计算的高度,即按照宏块计算的图像实际高度FrameHeightInMbs = ( 2 − 1 ) * 23 = 23,frame_height = 16 × 23 = 368
- num_slice_groups_minus1某一帧中slice group的个数:该值为0表示一帧中所有的slice都属于一个slice group
- deblocking_filter_control_present_flag表示Slice header中是否存在用于去块滤波器控制的信息:该标志位为1表示slice header中包含去块滤波相应的信息
其中,图像的宽高可以在下图所示的信息中得到验证:
2、以一个GOP为例,分析每个图像帧的类型及所用的编码比特数、QP值
使用ESEyE码流分析软件打开准备的pulada.mp4文件,如图。
从软件所给出的信息来看,第一个GOP的长度为165,即从第0帧到第164帧均属于第一个GOP。以该GOP为例,对每个图像帧的类型及所用的编码比特数、QP值进行统计与分析。
注:此过程可以使用ESEyE码流分析软件Tools工具栏下的Save Statistics帮助完成。
统计结果整理如下:
(1)以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图
(2)以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
3、 以第一个I帧作为分析对象,分析每个宏块所采用的编码类型及其比例。
第一个I帧图像如图:
该图像的宏块大小和类型如图:
在大面积着色的区域,大多采用8x8和16x16的宏块;在细节丰富的地方,大多采用4x4的宏块。
对该帧图像的宏块类型进行统计,并计算比例。结果如下:
4、以第一个P帧作为分析对象,分析每个宏块所采用的编码类型及其比例。
第一个P帧图像如图:
该图像的宏块大小和类型如图:
该帧图像是GOP序列第一个P帧图像,即以上面的I帧为参考帧进行前向预测编码。观察上图容易发现,由于上图与I帧图像的差异很小,所以绝大部分宏块采用了P_skip的方式进行编码,从而降低传输的码率。而对于一些与I帧中相应宏块的匹配度不是很高的宏块,则采取了帧内编码和前向预测编码的方式进行编码。这一现象表明,在P帧中,大部分宏块属于P_skip类型,但也有可能存在帧内编码类型的宏块,是否出现这种情况取决于当前宏块与参考帧中相应宏块的匹配程度。 具体的统计结果如下图:
5、以某一个B帧作为分析对象,分析每个宏块所采用的编码类型及其比例。
第一个B帧图像如图:
该图像的宏块大小和类型如图:
该帧图像是GOP序列显示的第二帧图像(即第一个B帧图像),比较该帧图像与其参考帧可以发现,两帧图像高度相似,所以绝大多数的宏块均为B_skip。具体结果如下:
视频运动越小,QP越大,P_skip和B_skip宏块出现的概率就会越高,该宏块的像素残差和运动矢量残差必定为零(运动矢量不一定为零),所以无需传送像素残差和运动矢量残差,极大的节省了编码效率。
第二个B帧图像如图:
该图像的宏块大小和类型如图:
该帧图像是GOP序列显示的第三帧图像(即第二个B帧图像),比较该帧图像与其参考帧可以发现,两帧图像基本相似,即绝大多数的宏块依然是B_skip。但仍有个别宏块使用了B_16x16,甚至是I_8x8进行编码,这是因为这部分宏块与前一帧相应的宏块在像素颜色或运动矢量等方面有着一定的差异,故不能简单的采用B_skip编码方式,否则难以保证图像质量。同时,这一现象也表明B帧图像中可以含有以I、P帧编码方式进行编码的宏块,这种做法是为了更好的图像质量,但并不影响B帧整体的编码方式。具体统计结果如下: