H.264以及编码调试
一、H.264编码原理
H.264相比于之前讲过的MPEG-2来说,注重实用,采用更成熟的技术,要求更高的编码效率和简洁的表现形式。与此同时,在混合编码器的基本框架下,H.264对MPEG-2中的主要关键模块都进行了重大改进。但是,H.264标准的预测、变换、量化、熵编码等基本模块和MPEG-2并没有太大的区别,变化主要体现在功能模块的具体细节上。
1. H.264的特点
- 压缩比高:在同等图像质量的条件下,采用H.264技术压缩后的码流,数据量只有MPEG-2的1/2;
- 容错率高:H.264码流具有较强的抗误码特性,可适应丢包率高、干扰严重的信道,如IP和无线网络;
- 网络适应性强:H.264提供了网络适应层,使得H.264的文件能容易地在不同网络上传输;
- 计算复杂度高:H.264使用较高的计算复杂度,换取优越的性能,其复杂度相当于MPEG-2的2—3倍。
2. H.264和其他MPEG-2编码标准的差异:
- 帧内预测
在空间域内进行帧内预测,提高帧内编码的精确度。 - 运动估计和运动补偿
不同尺寸的块和形状,高分辨率的子像素运动估计,选择多个参考帧 - DCT变换
使用整数的DCT变换 - 去块效应滤波
为消除块效应,增加了自适应消块滤波器 - 熵编码技术
通用变长编码(UVLC),基于上下文的自适应变长码编码(CAVLC),基于上下文的自适应二进制算术编码(CABAC)
二、H.264解码器
修改decoder.cfg文件中的输入文件和输出文件:
InputFile = "foreman_part_qcif.264" # H.264/AVC coded bitstream
OutputFile = "foreman_part_qcif.yuv" # Output file, YUV/RGB
可将.264文件解码为.yuv文件:
三、H.264编码
在进行实验前,我们先搞清一些参数:
- InputFile
/
OutputFile/
ReconFile:输入文件/输出文件(.264)/重建文件(.yuv) - SourceWidth
/
SourceHight/
OutputWidth/
OutputHeigh:输入、输入视频序列的宽、高 - FramesToBeEncoded:帧数
- IntraPeriod:GOP内I帧的周期
- IDRPeriod:IDR帧的周期,表示GOP长度
- EnableIDRGOP:表示是否允许IDR帧
- Bitrate:比特率
- NumberBFrames:两个I/P帧之间B帧的数目
- PrimaryGOPLength:冗余分配的GOP长度
设定IntraPeriod = 0,PrimaryGOPLength = IDRPeriod(控制变量法)
分别选择比特率为40、80、200、500、1000 kbps,再对每一比特率各自分别设置GOP格式为GOP15(2B)、GOP12(2B)、GOP9(2B)、GOP4(1B)、GOP12(no B)和GOP1(all I)进行编码。
GOP1(all I):
1000:
500:
200:
80:
40:
GOP12(no B):
1000:
500:
200:
80:
40:
GOP4(1B):
1000:
500:
200:
80:
40:
GOP9(2B):
1000:
500:
200:
80:
40:
GOP12(2B):
1000:
500:
200:
80:
40:
GOP15(2B):
1000:
500:
200:
80:
40:
四、结果分析
1. 码流分析
用Elecard StreamEye Tools码流分析软件对编码后的内容进行分析。
以GOP15(2B)的情况为例:
图中,红、蓝、绿分别表示I、P、B帧,我们可以清楚看到编码后视频的码流结构并且可以看到有帧重排(显示顺序为IBBPBBPBBPBBPBP)。
我们截取其中四帧进行分析:
红、橙:帧内编码 黄:与前一帧相同,跳过编码 绿:前项预测 蓝:双向预测
可看出:
- I帧使用帧内编码,无运动矢量,B、P帧中都可看到运动矢量
- 4帧的背景大体都相似,因而背景部分均没有进行编码
- 通过宏块分界线我们还可以看到H.264中不同形状、不同大小的宏块,且在低频区域的宏块更大。这也是前面提到的H.264采用的先进技术之一(感谢zsz同学提醒)
2.视频差异分析
3.视频质量评估
将前文中得到的实际码率和Y-PSNR整理到一个表格中,得到如下图所示的表格:
根据上述表格中的数据作图,如下图所示:
从图中可以得到(折线的标签不知道为什么总是打不出来),在码率相同的前提下,视频质量大体情况由好到差为:GOP12 (0B) > GOP15 (2B) > GOP12 (2B) > GOP9 (2B) > GOP4 (1B) > GOP1 (all-I)。