【数据压缩12】Lab7 H.264码流分析
一 、实验原理
1. H.264编码原理
H.264相比于之前讲过的MPEG-2来说,注重实用,采用更成熟的技术,要求更高的编码效率和简洁的表现形式。与此同时,在混合编码器的基本框架下,H.264对MPEG-2中的主要关键模块都进行了重大改进。但是,H.264标准的预测、变换、量化、熵编码等基本模块和MPEG-2并没有太大的区别,变化主要体现在功能模块的具体细节上。
H.264在视频编码层(VCL)和网络提取层(NAL)之间进行概念分割,以实现在不同的传输环境下的有效传输,便于与当前和将来的编码格式和不同类型的网络进行无缝连接。
2. H.264的特点
压缩比高:在同等图像质量的条件下,采用H.264技术压缩后的码流,数据量只有MPEG-2的1/2;
容错率高:H.264码流具有较强的抗误码特性,可适应丢包率高、干扰严重的信道,如IP和无线网络;
网络适应性强:H.264提供了网络适应层,使得H.264的文件能容易地在不同网络上传输;
计算复杂度高:H.264使用较高的计算复杂度,换取优越的性能,其复杂度相当于MPEG-2的2—3倍。
3. H.264和其他MPEG-2编码标准的差异
帧内预测
在空间域内进行帧内预测,提高帧内编码的精确度。不可以用下方或右方的像素来预测,原因是需要保证编解码端的一致性,解码端只能用解码以后的样本,不能用下方或右侧还未编码的像素。
基于运动估计和运动补偿的帧间预测:去除时间冗余
不同尺寸的块和形状,高分辨率的子像素运动估计,选择多个参考帧
DCT变换:去除空间冗余
使用整数的DCT变换,利用相关性,去除空间冗余
熵编码技术:去除统计冗余
通用变长编码(UVLC),基于上下文的自适应变长码编码(CAVLC),基于上下文的自适应二进制算术编码(CABAC)
二、实验步骤
一、 选择一个.mp4或者.264文件。
二、 在码流分析仪软件中打开该文件,从几个层次进行分析:
(1) 分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)
(2) 以一个GOP为例,分析如下信息:
-
每个图像帧的类型及所用的编码比特数、QP值;
- 以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;
- 以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。
-
以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。
-
以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
-
以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。
1. SPS(Sequence Parameter Set)
序列参数集SPS(Sequence parameter set): 说明的是某一段视频序列的编码特性。
SPS里主要保存了一组编码视频序列(Coded Video Sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集(PPS)中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。NAL 类型为7时,表示该Unit内保存的数据类型为SPS(Sequence Parameter Set)。
分辨率
在H.264中,每个解码宏块都是16*16像素的块。竖直方向宏块的数量23和水平宏块的数量40,计算出该图像的分辨率是:
宽=16 * 40=640pixel
高=16 * 23= 368pixel
编解码器Profile@Level
profile_idc 和level_idc- 标识当前H.264码流的Profile(型)和Level(级)。这两个语法元素说明该段视频序列遵循的是H.264/AVC标准的哪一种配置,以指导解码端调用合适的解码器进行解码。型和级有11种组合。
当前视频流的型和级:High Profile @ Level 31
2. PPS(Picture Parameter Set)
图像参数集PPS(Picture parameter set): 说明的是某个图像帧的编码特性。 包括编码该图像帧所采用的熵编码模式(CAVLC或者CABAC),所使用的参考帧的数目,以及对该图像帧的亮度和色度残差进行量化时所采用的量化参数值等。图像参数集中最主要的部分是该图像帧的Slice Group划分方式的表示(用于FMO),其中num_slice_groups_minus1语法元素说明了该图像帧中Slice Group的数目。同序列参数集的情况一样,每个图像帧的编码特性可能各不相同,也就需要一个pic_parameter_set_id来区分不同的图像参数集。
由上图可得,该视频序列有三个图像参数集,其序号分别为0,1,2。
以第一个图像参数集为例,num_slice_groups_minus1=0,pic_parameter_set_id=0。
该图像帧中Slice Group的数目为1,该图像参数集序号为0。
该文件只有一个PPS,该图像参数集序号为0,该图像帧中Slice Group的数目为1。
3. GOP结构及帧率
GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。
GOP长度为30,结构为IPBBBPBB…。看出I帧编码bit数最高,其次是P帧,B帧最少。
4. 每个图像帧的类型、所用的编码比特数、QP值
将视频的信息保存成.csv文件,Tools——>Save statistics...
以图像帧号为横坐标,每帧所用比特数为纵坐标画出曲线图
第二个GOP每帧所用比特数如下,看出I帧编码bit数最高,其次是P帧,B帧最少。
以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图
- 量化参数QP是量化步长Qstep的序号。
- QP取最小值0时,表示量化最精细,相反,QP取最大值时,表示量化是最粗糙的。
- QP和Qstep具有线性相关性,Qstep随着QP的增加而增加,每当QP值增加6,Qstep便增加一倍。
该视频序列单个图像帧内每个宏块QP值一致,QP值不能批量获取。
第二个GOP部分每帧所用QP值如下,I帧的QP值相对P、B帧较小,也就是说明量化步长小,细量化。
I帧
Movie.mp4
视频的第一帧为I帧,该帧均采用帧内预测编码,其中橙色的点量化等级更高。由于该帧没有前参考帧,没有使用到运动矢量。
这里面包含了16 * 16作为一个宏块进行量化、8 * 8作为一个宏块进行一个量化、4*4作为宏块进行量化的三种类型。量化较细的地方通常有更多细节的呈现。
每种类型所占的比例
P帧
第四帧是P帧,在编码时,是按照IPBBB的顺序进行编码,然后进行帧重排。该帧组成元素有黄色、蓝色和红色。红色代表帧内编码:
这里的蓝色代表了前向预测,用到了运动矢量。
运动矢量,主要集中在面部,比较细致的表情变化。
这里面包含了16 * 16作为一个宏块进行量化、16 * 8作为一个宏块进行一个量化、8*8作为宏块进行量化的三种类型。量化较细的地方通常有更多细节的呈现。
每种类型所占的比例
B帧
第10帧为B帧,B帧支持帧间预测(包括了前向预测、后向预测和前向及后向预测)和帧内预测。
该帧组成元素有黄色、蓝色。这里黄色是B_skip块:它代表了这一帧的数据内容与前一帧相同,跳过不编码。可以看到黄色的Macro Block所占用bit数为0bit,只需要提前使用一些比特进行说明就行。
红色代表帧内编码;蓝色是前向+后向预测编码,也是B帧所独有的编码方式
运动矢量
这里面包含了16 * 16作为一个宏块进行量化、16 * 8作为一个宏块进行一个量化、8*8作为宏块进行量化的三种类型。量化较细的地方通常有更多细节的呈现。
每种类型所占的比例