H.264编码原理简介
H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC运动图像专家组(MPEG)联合组成的联合视频组(JVT,Joint VideoTeam)提出的新一代数字视频压缩标准。
其优点在于注重对移动和IP网络的适应,采用分层技术,从形式上将编码和信道隔离开来,实质上是在源编码器算法中更多地考虑到信道的特点,编码原理可由如下流程表示:
解码流程:
除此之外,H.264引进了更先进的模块:
帧内预测
在空间域进行帧内预测,提高帧内编码的精确度。
运动估计与运动补偿
不同尺寸的块和形状,高分辨率的子像素运动估计和选择多个参考帧。
DCT变换
H.264使用整数的DCT变换,计算更简便,没有精度损失。
去块效应滤波
为消除块效应,增加了自适应消块滤波器。
熵编码技术
通用变长编码(UVLC, universal variable lengthcoding)、基于上下文的自适应变长码编码(CAVLC,context-based adaptive variable length coding)或基于上下文的自适应二进制算术编码(CABAC, context-based adaptive binary arithmetic coding)。
H.264编解码实验
实验内容:参考JM Reference Software Manual(JVT-AE010)文档,自主学习分析设置编解码器参数。
H.264解码
实验要求:将自行选择的.264文件进行解码,得到相应的.YUV文件。
H.264解码参数输入在所给的解码器工程jm_vc10.sln 的 decoder.cfg中,所需要自行设定的参数有:
InputFile = "highway_qcif.264" # H.264/AVC coded bitstream
OutputFile = "highway_qcif.yuv" # Output file, YUV/RGB
RefFile = "highway_qcif.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)
通过修改InputFile与OutputFile参数设置需要解码和生成的文件,WriteUV决定了色度分量的采样方式,采用默认即可,其他参数也如此。
修改参数后运行ldecod.exe执行文件进行解码:
用yuvviewer查看生成的yuv文件
H.264编码
实验要求:将.yuv文件编码成.264文件,采用两种对照:
- 固定码率,以不同的GOP长度及形状编码,如GOP=15,2B帧;GOP=12,2B帧;GOP=4,1B帧;GOP=1,全I帧……
- 固定GOP长度及形状,不同的码率编码,如1000kb/s,800kb/s,400kb/s……
以实验中使用的miss.yuv为例,在encoder.cfg文件中修改编码参数:
InputFile = "miss.yuv" # Input sequence
InputHeaderLength = 0 # If the inputfile has a header, state it's length in byte here
StartFrame = 0 # Start frame for encoding. (0-N)
FramesToBeEncoded = 22 # Number of frames to be coded
FrameRate = 30.0 # Frame Rate per second (0.1-100.0)
、、、、、
SourceWidth = 352 # Source frame width
SourceHeight = 288 # Source frame height
SourceResize = 0 # Resize source size for output
OutputWidth = 352 # Output frame width
OutputHeight = 288 # Output frame height
、、、、
OutputFile = "miss_gop1_0b_10k.264" # Bitstream
通过InputFile 、OutputFile 设定输入和输出的文件,FramesToBeEncoded决定了编码的帧数,根据输入文件的帧数自行设定;SourceWidth 、SourceHeight 和 OutputWidth 、OutputHeight 分别为输入、输出文件的宽高。
EnableIDRGOP = 1 # Support for IDR closed GOPs (0: disabled, 1: enabled)
IntraPeriod = 0 # Period of I-pictures (0=only first)
IDRPeriod = 1 # Period of IDR pictures (0=only first)
NumberBFrames = 0 # Number of B coded frames inserted (0=not used)
PrimaryGOPLength = 12 # GOP length for redundant allocation (1-16)
将EnableIDRGOP设定为1,以启用IDR帧
IntraPeriod 为GOP中I帧的周期,设定为0表示只有第一帧为I帧;IDRPeriod 则决定了GOP中IDR帧的周期。IDR帧为一种特殊的I帧,但一个GOP组中只有一个IDR帧,通常放在GOP的第一个I帧中,以区分GOP组。为了方便本次实验,将IntraPeriod设为0,IDRPeriod 则为 GOP长度。
NumberBFrames 为B帧的数量,决定了GOP的结构。
PrimaryGOPLength 初始化GOP长度,设定 PrimaryGOPLength= IDRPeriod
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000000 # Bitrate(bps)
将RateControlEnable 设为1 以启用码率控制,Bitrate 则为设置的码率。
参数设定完成后运行 lencod.exe 执行文件,得到编码后的文件。
以GOP=12,2B,1000kb/s的文件为例,用码流分析软件ESEYE打开:
图中红色条柱表示I帧,蓝色条柱表示P帧,绿色条柱表示B帧,通过码流分析软件可以清晰的看到编码后文件的帧结构,图中所显示的为编解码时帧重排的顺序:IPBBPBBPBBPB
选取四帧(I\P\B\B)进行进一步分析:
图中可以看到,I帧为帧内预测编码,没有运动矢量;P帧为前向帧间预测,红色条纹表示其运动矢量;B帧为双向帧间预测,红色条纹表示前向预测运动矢量,绿色条纹表示后向预测运动矢量;背景变化较少,几乎无运动矢量。
码流质量分析
从理论分析可以得知,相同的GOP长度及形状,码率越高,视频质量越高;相同的码率,GOP越长,视频质量越高。
帧结构\ 码率 | 1000kb/s | 800kb/s | 400kb/s |
---|---|---|---|
GOP=15,2B | ![]() | ![]() | ![]() |
GOP=12,2B | ![]() | ![]() | ![]() |
GOP=9,2B | ![]() | ![]() | ![]() |
GOP=4,1B | ![]() | ![]() | ![]() |
GOP=12,0B | ![]() | ![]() | ![]() |
GOP=1,全I | ![]() | ![]() | ![]() |
肉眼的观感基本与理论符合,相同帧结构,不同码率下的视频噪声差异较为明显,而相同码率,不同帧结构下,肉眼观感差异不大。
生成率失真曲线
计算PSNR,绘制率失真曲线如下:
PSNR越高,表明视频的质量越好。