H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC运动图像专家 组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的新一代数字视频压缩标准。与之前的标准一样,同样采用了帧内预测,运动预测,变换编码,熵编码结合的方法(这些方面和之前的标准一致,即混合编码器的基本框架),同时在此基础上做出一定改动(主要改动集中在功能模块的具体细节上),以适应更高的编码效率,更简洁的表达形式等要求。
在应用方面,H.264更注重对移动和IP网络的适应,采用分层技术将编码和信道分离开(实际上是在编码过程中更注重对信道条件的考虑)。
此外,H.264并没有规定一个标准的编解码器,定义的是定义的是编码视频比特流的语法结构和对该比特流解码的方法。大体框架于之前的标准(如MPEG-2)相比没有改变。以下为一种编解码器示例:
与之前标准一样,H.264定义了不同的型和级,此外H.264的编码基本单元不是宏块,而是片(Slice),一个视频图像划分为数个片,每个片包含整数个宏块。
与之前的标注相比相比使用的先进技术有:
编码方案主要有视频编码层和网络抽象层组成,编码和信道分离。
根据邻近块的值来预测当前宏块的值,然后再对预测值和原始值的差值进行变换、量化和编码。具体预测方案分为亮度块的4x4和16x16模式,色度块的8x8模式。,每个模式各自有不同的预测模型。
在基于块的运动补偿基本思想下有如下改动:
实际上仍为DCT变换。以Baseline为例,对不同的数据进行不同的整数变换:4x4的残差数据块变换,4x4的亮度DC系数块变换,2x2的色度DC系数块变换。
H.264标准支持52个量化步长,对应于不同的量化参数(QP)如表所示,QP值每增加6,Qstep值增加一倍。量化步长取值范围很广,这就为编码中兼顾比特率和编码质量提供了足够多的灵活度和准确度。
H.264/AVC定义了一个自适应循环滤波器,滤波的强度通过几个语法元素控制。滤波的基本思想是:如果块边沿的绝对差值相对比较大,出现块人工瑕疵的可能性就很大, 因此需要进行相应处理。
H.264提供的熵编码方案有:通用变长码编码UVLC,基于上下文的自适应变长编码CAVLC,基于上下文的自适应二进制算术编码CABAC。
根据程序参考手册JM Reference Software Manual可知,jm_vc10.sln程序的编解码参数在encoder.cfg,encoder_yuv422.cfg,decoder.cfg中,根据实验具体要求修改其具体内容。
将实验提供的264格式文件解码为raw格式的yuv文件。修改相应输入输出输出文件参数即可,其他参数设定默认。以highway_qcif.264(176X144,4:2:0)为例:
decoder.cfg
# New Input File Format is as follows
# <ParameterName> = <ParameterValue> # Comment
#
##########################################################################################
# Files
##########################################################################################
InputFile = "highway_qcif.264" # H.264/AVC coded bitstream
OutputFile = "highway_qcif_dec.yuv" # Output file, YUV/RGB
RefFile = "highway_qcif_rec.yuv" # Ref sequence (for SNR)
WriteUV = 1 # Write 4:2:0 chroma components for monochrome streams
FileFormat = 0 # NAL mode (0=Annex B, 1: RTP packets)
RefOffset = 0 # SNR computation offset
POCScale = 2 # Poc Scale (1 or 2)
##########################################################################################
# HRD parameters
##########################################################################################
#R_decoder = 500000 # Rate_Decoder
#B_decoder = 104000 # B_decoder
#F_decoder = 73000 # F_decoder
#LeakyBucketParamFile = "leakybucketparam.cfg" # LeakyBucket Params
##########################################################################################
# decoder control parameters
##########################################################################################
DisplayDecParams = 1 # 1: Display parameters;
ConcealMode = 0 # Err Concealment(0:Off,1:Frame Copy,2:Motion Copy)
RefPOCGap = 2 # Reference POC gap (2: IPP (Default), 4: IbP / IpP)
POCGap = 2 # POC gap (2: IPP /IbP/IpP (Default), 4: IPP with frame skip = 1 etc.)
Silent = 0 # Silent decode
IntraProfileDeblocking = 1 # Enable Deblocking filter in intra only profiles (0=disable, 1=filter according to SPS parameters)
DecFrmNum = 0 # Number of frames to be decoded (-n)
##########################################################################################
# MVC decoding parameters
##########################################################################################
DecodeAllLayers = 0 # Decode all views (-mpr)
DisplayDecParams设为1,以便运行时显示相关参数。
将上述得到的raw格式重新编码为H.264格式,具体要求为:
1.固定码率,以不同的GOP长度及形状编码
GOP=15,2B帧;GOP=12,2B帧;GOP=9,2B帧
GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
一般来说,在相同码率下,GOP越长,即P,B帧的比重更大,视频的质量越好。
2.相同的GOP长度及形状,不同的码率
例:1000kb/s, 800kb/s,400kb/s,…
在相同GOP条件下,码率提高,I帧越多,视频质量越低。
同样,上述参数可以通过修改参数文件实现,编码参数文件为encoder.cfg。
这里首先要分清楚IDR帧和I帧,每个GOP中只有一个IDR帧,它界定了GOP与GOP之间互不干扰。
然而一个GOP中可以有多个I帧。根据具体情况本次实验中设置1个GOP中1个I帧,即IDR帧,所以IDRPeriod也是应与GOP长度一致,如下:
IntraPeriod = 0 # Period of I-pictures (0=only first)
IDRPeriod = 12 # Period of IDR pictures (0=only first)
此外在配置文件中可以看到由两种不同的GOP模式,IDR-GOP和open GOP,分别对应了有IDR帧界定GOP的方式和开放GOP方式,显然我们选择前者,为此设置一下参数:
EnableIDRGOP = 1 # Support for IDR closed GOPs (0: disabled, 1: enabled)
EnableOpenGOP = 0 # Support for open GOPs (0: disabled, 1: enabled)
此外,设置不同的B帧格式。
同时要控制不同的GOP长度,需要设置PrimaryGOPLength参数。
如GOP=12,2B帧,帧结构为IBBPBBPBBPBB,则设置NumberBFrames=2,PrimaryGOPLength=12。
要使用全I帧模式,即设置PrimaryGOPLength=1,NumberBFrames=0即可
同时还需要关闭B帧的Hierarchy编码模式。
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
HierarchicalCoding = 0 # B hierarchical coding (0= off, 1= 2 layers, 2= 2 full # hierarchy, 3 = explicit)
PrimaryGOPLength = 12 # GOP length for redundant allocation (1-16)
码率控制相关参数如下:
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000000 # Bitrate(bps)
此外对码率控制算法也有所要求,参数RCUpdateMode 提供了四种不同的码率控制算法:
RCUpdateMode = 2 # Rate Control type. Modes supported :
# 0 = original JM rate control,
# 1 = rate control that is applied to all frames # regardless of the slice type,
# 2 = original plus intelligent QP selection for I and B # slices (including Hierarchical),
# 3 = original + hybrid quadratic rate control for I and # B slice using bit rate statistics
取值分别表示:
本次实验中对全I帧模式适用模式1,而有B,P帧使用模式2或3,这里选择模式2。
剩下还有输入输出图像宽高,文件名,编码帧数,帧率,TRACE设置等参数根据文件属性进行设置,在此不赘述。
通过调整配置文件参数运行文件,根据实验要求输出不同模式的H.264编码文件。
设置参数后命令行直接运行生成的ldecod.exe文件即可:
命令行中输入I(IDR),P帧的相关信息,如POC(Picture Order Count),QP(Quantization Parameter)等。
SNR,解码时间,状态信息输出文件等。由于没有highway_qcif_rec.yuv输入作为参照,SNR无法计算。
生成文件highway_qcif_dec.yuv为解码生成的YUV文件。
highway_qcif帧数过多,选择另一样本进行编码实验。
对raw格式的hall_cif.yuv(352x288)用不同的GOP格式进行H.264编码,设置参数后直接在命令行运行lecode.exe即可。
运行过程中命令行会显示编码相关参数,各帧的编码信息等,如下图所示(15GOP,2B,1000kbps):
参数中比较重要的信息有帧序列结构Sequence Type,宽高数值,帧数帧率等。
下方帧编码信息中左侧Frame一列表示帧序号,可以看出编码顺序与帧序号不同,因为B帧的存在进行了帧重排。初次还有量化系数,bit信息量,作为参考帧等信息。
编码结束后会总结总编码时间,失真率等信息。其中Y分量的PSNR即本次实验需要的失真率曲线数据。
用StreamEye软件可以对编码后的H.26码流进行分析,以15GOP,2B,1000kbps为例:
图中每一竖条代表一帧,红色为I帧,蓝色为P帧,绿色为B帧。15GOP2B的帧顺序为IBBPBBPBBPBBPBP,在此处由于本质上是将H.264码流进行解码分析,因此图中帧顺序为编解码顺序,即帧重排后的顺序,即IPBBPBBPBBPBBPB。
还可以查看码流相关参数信息,在此不赘述。
用软件可以查看每一帧的详细编码信息,以下以一组IBBP为例:
顺序为IBBP。
I帧中,进行帧内编码。
B帧中,黄色代表和参考帧无变化(B-skip),蓝色则代表可有由一定的残差数据从参考帧得到。
P帧中,红色橙色为帧内(Intra)MB,其大小的编码模式各有不同。蓝色为帧间MB.
在B,P帧中的点与点之间的一些线条代表了运动矢量。
由于H.264的预测算法特点,每个块的大小和预测模式各不相同。选定一个点可以查看该点代表的编码宏块的具体信息,包括宏块类型,预测模式,大小等。下图为选中的一个B帧中的黄色块:
这个块没有任何信息写进流中,因为这些信息可以在参考帧中找到,即B—skip。
选择码流的最后一帧进行对比:
15GOP,2B | 12GOP,2B | |
---|---|---|
1000kbps | ||
800kbps | ||
400kbps | ||
200kbps | ||
100kbps |
12GOP,0B | 9GOP,2B | |
---|---|---|
1000kbps | ||
800kbps | ||
400kbps | ||
200kbps | ||
100kbps |
4GOP,1B | 1GOP,0B | |
---|---|---|
1000kbps | ||
800kbps | ||
400kbps | ||
200kbps | ||
100kbps |
结果可得,码率越高视频质量越高,且上述GOP格式视频质量由好到差。
在较低码率范围,码率提高,视频质量将显著提高。
此外,由于raw格式中有一定的背景噪音,当GOP长度提高,背景噪声的变化周期边长,当然码率提高,视频质量提高后噪声会越来越不容易察觉。
本次实验选用Y分量的PSNR作为失真率标准,曲线如下:
由图可知,1GOP,0B(全I帧)和4GOP,1B两种模式和其他模式的视频质量差距较大,这从之前的视频质量观察中肉眼也可看出。剩下几种GOP模式差距较小此外,一般来说GOP越长,质量越好。
码率上升带来的视频质量提高较明显,当码率提升,质量提升效果也慢慢减少。
此外,注意全I帧中400kbps以下没有变化,可能是因为400kbps-800kbps触及了码流的下界。