H.264编解码原理及实验

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/s800kb/s400kb/s
GOP=15,2B在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=12,2B在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=9,2B在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=4,1B在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=12,0B在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=1,全I在这里插入图片描述在这里插入图片描述在这里插入图片描述

肉眼的观感基本与理论符合,相同帧结构,不同码率下的视频噪声差异较为明显,而相同码率,不同帧结构下,肉眼观感差异不大。

生成率失真曲线

计算PSNR,绘制率失真曲线如下:

在这里插入图片描述
PSNR越高,表明视频的质量越好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值