H.264是国际标准化组织(ISO)和国际电信联盟(ITU)在2002年12月共同提出的继MPEG-4之后的新一代数字视频压缩格式,其具有更高的编码效率,并注重对移动和IP网络的适应,考虑信道的特点,能控制误码扩散。
本文将简单介绍H.264编码的原理,并使用JM 18.6进行编解码器的调试。
一. H.264简介
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编解码器
H.264编码器结构与前代MPEG-2标准差别不大,均主要采用变换编码、DPCM与运动补偿的混合结构。编解码器的结构如图1-1所示。
3. H.264采用的先进技术
(1) 分层设计
H.264在视频编码层(VCL)和网络提取层(NAL)之间进行概念分割,以实现在不同的传输环境下的有效传输,便于与当前和将来的编码格式和不同类型的网络进行无缝连接。分层结构如图1-2所示。
(2) 帧内预测编码
根据邻近块的值来预测当前宏块的值,再对预测值和原始值的差值进行变换、量化和编码。对于亮度块,使用4×4与16×16编码模式,对色度块采用8×8编码模式。
以亮度块的4×4帧内预测模式为例,由周围的15个像素预测4×4的16个像素,共有9种预测模式,分别计算各自的SAE,以最小者作为该块的预测模式。
(3) 帧间预测编码——基于块的运动补偿
- 树状结构运动补偿:使用不同大小和形状的块进行运动补偿(低频区域使用大块,高频区域使用小块);
- 使用1/4像素精度运动矢量
- 在多个参考帧中进行运动搜索,选择一个与编码帧最相似的帧作为参考帧
- 引入SI帧和SP帧:适应码流带宽自适应和抗误码的要求,改善网络亲和性,支持流媒体服务
(4) 整数变换
使用整数DCT代替MPEG-2中的DCT,保证变换中无精度损失,且标准中对正反变换有详细说明,不会出现误匹配。另外,整数变换仅需要移位和加法,最大程度提高运算效率。
(5) 量化处理
H.264标准支持52个量化步长,量化参数QP每增加6,量化步长Qstep增加一倍。量化步长取值范围很广,这就为编码中兼顾比特率和编码质量提供了足够多的灵活度和准确度。
(6) 去块效应滤波
为消除块效应,H.264编码系统的预测环路中增加了自适应去块效应滤波器。
(7) 熵编码
H.264标准中给出了两种熵编码方法:CAVLC(Context-based Adaptive Variable Length Coding,基于上下文的自适应可变长编码)和CABAC(Context-based Adaptive Binary Arithmetic Coding,基于上下文的自适应二进制算术编码),其中前者为基本编码方法,后者可选编码方法,且后者的编码性能相较于前者较好,但计算复杂度更高。
4. 概念说明
为了便于理解后面JM编码器的相关内容,这里将MPEG-2中包含的、但在H.264中略有区别的一些概念再做一下说明。
(1) 视频编码帧
- I帧(Intra Frame,帧内编码帧):只使用本阵内的数据进行编码(DCT、量化、熵编码),压缩比较低,约为(2—5):1。此外还有IDR帧(Instantaneous Decoding Refresh Frame),是GOP的第一个I帧(一种特殊的I帧)。IDR帧之后的所有帧都不能参考IDR帧之前帧的内容(而位于普通的I帧之后的P/B帧可以参考其之前的I帧),也就是说,从IDR帧开始,重新算一个新的序列开始编码,因而播放器永远可以从一个IDR帧开始播放,因为在其之后没有对于任何其之前帧的参考。
- P帧(Predictive Frame,前向预测编码帧):以前面最靠近的I帧或P帧作为参考进行前向预测编码。
- B帧(Bidirectional Predictive Frame,双向预测编码帧):以一个前面的参考帧和一个后面的参考帧进行双向预测编码。
(2) GOP
GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。
GOP大小不固定,但GOP一定以I帧开始,但每个GOP可能包含多个I帧。
增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。
闭合GOP(Closed GOP)与开放GOP(Open GOP):在H.264的GOP中,所有的GOP都是独立解码的,与其他GOP无关,即它们都是“闭合”的。但是在HEVC中,GOP的结构发生了变化,采用了“开放”的结构,在解码过程过可能会参考其他GOP的数据。
(3) 帧重排
由于B帧是双向预测帧,因此在后向预测时,需要以其后面的P或I帧作为参考,因此需要将原始图像顺序重新排序后送入编码器,如图1-5所示。(图1-4表示的是播放顺序。)
二. H.264解码器调试
decoder_test.c
#define BITSTREAM_FILENAME "highway_qcif.264"
#define DECRECON_FILENAME "highway_qcif_dec.yuv"
即可将.264文件解码为.yuv文件。
三. H.264编码
1. 编码参数
部分需要调整的编码参数的含义如下表所示。
InputFileOutputFileReconFileSourceWidthSourceHightOutputWidthOutputHeightFramesToBeEncodedIntraPeriodIDRPeriodEnableIDRGOPEnableOpenGOPNumberBFramesPrimaryGOPLengthRateControlEnableBitrateRCUpdateMode
IntraPeriodIDRPeriodNumberBFramesPrimaryGOPLength
IDRPeriodIntraPeriodIntraPeriodIDRPeriodIntraPeriodNumberBFramesNumberBFramesIntraPeriodIntraPeriodNumberBFramesPrimaryGOPLengthIDRPeriodIDRPeriodPrimaryGOPLength
NumberBFrames
IntraPeriodIDRPeriodPrimaryGOPLengthIBBPBBPBBPBBPBPIBBPBBPBBPBIBBPIBBPBBPBBPBBPBPIBIBIBIBIBIBIBIIBBPBBPBBPBIBBP
2. 编码器调试
IntraPeriodPrimaryGOPLengthIDRPeriod
分别选择比特率为1600、1650、1700、1750、1800 kbps,再对每一比特率分别设置GOP格式为GOP15(2B)、GOP12(2B)、GOP9(2B)、GOP4(1B)、GOP12(无B)和GOP1(全I)进行编码。
运行lencode项目,对miss.yuv进行编码,运行结果如下:
以GOP12(0B)@1800 kbps的情况为例,从表格中可以看到GOP大小为12,并且可以看到帧重排。
四. 结果分析
1. 码流分析
下面使用Elecard StreamEye Tools码流分析软件对编码后的内容进行分析。
以GOP15(2B)的情况为例:
图中每个矩形代表一帧(红、蓝、绿分别表示I、P、B帧),我们可以清楚地看出编码后视频的码流结构并且可以看到有帧重排(显示顺序为IBBPBBPBBPBBPBP)。
下面我们以其中的4帧(I、B、B、P)进行分析。
我们在预览中打开显示宏块分界线、宏块类型和运动矢量。
画面中,红色、橙色宏块均使用帧内编码(宏块大小略有不同);黄色宏块类型为Inter(B_Skip),表示与前一帧相同,跳过不编码;绿色宏块使用前向预测编码,蓝色宏块使用双向预测编码。
在图4-2中,我们可以看到:
- 4帧的背景部分变化均很小,因而背景部分均没有进行编码;
- B、P帧中可看到运动矢量。红色线表示前向预测,绿色线表示后向预测,因此P帧中只有红色线,I帧使用帧内编码,无运动矢量;
- 通过宏块分界线我们还可以看到H.264中不同形状、不同大小的宏块,且在低频区域的宏块更大。这也是前面提到的H.264采用的先进技术之一。
2. 视频质量客观评价
下面我们对前面编码得到的6中GOP结构的5种比特率的H.264文件进行视频质量客观评价,评价指标采用Y分量的PSNR (dB)。由于编码后H.264文件的实际比特率与目标比特率之间有一定误差,因此我们以实际比特率进行率失真曲线的绘制。
从图中可以看到,在码率相同的前提下,视频质量由好到差为:GOP12 (0B) > GOP15 (2B) > GOP12 (2B) > GOP9 (2B) > GOP4 (1B) > GOP1 (all-I)。
下表中列出了6中GOP结构各自的I、P、B帧的占比。例如我们可以比较GOP15(2B)和GOP12(2B),二者P帧占比相同,而前者的B帧占比更大,因而具有更好的图像质量。视频质量相同的前提下,可以进行类比分析,这里不再赘述。
IPPPPPPPPPPPIBBPBBPBBPBBPBPIBBPBBPBBPBPIBBPBBPBPIBPPI
3. 视频质量主观评价
由于我们无法得到实际码率严格相等的一组H.264码流,因此我们只能在同一种GOP结构下进行不同码率的主观评价。以GOP12(2B)为例:
事实上,由于相邻两张之间码率只相差大约500 kbps,因此很难看出有差别,即便是最高和最低码率之间的对比,也几乎无差异。