H.264编解码实验

原理

概述

H.264/AVC标准没有明确定义一个编解码器。

标准定义的是编码视频比特流的语法结构和对该比特流解码的方法。H.264标准的预测变换量化熵编码等基本功能模块与前几个标准(MPEG-1, MPEG-2, MPEG-4,H.261,H.263)并无太大区别。变化主要体现在功能模块的具体细节上。

特点

  • 压缩效率高
  • 容错能力强
  • 网络适应性好
  • 计算复杂度高

流程图

编码器

在这里插入图片描述

解码器

在这里插入图片描述

编解码器输入参数说明

在这里插入图片描述

缩写

缩写全称
AVCAdvanced Video Codec
CABACContext-based Adaptive Binary Arithmetic Coding
CAVLCContext-based Adaptive Variable Length Coding
CBRConstant Bit Rate
DPBDecoded Picture Buffer
EPZSEnhanced Predictive Zonal Search
FFSFast Full Search
FMEFast Motion Estimation
FRExtFidelity Range Extension
FSFull Search
GOPGroup of Pictures
HGOPHierarchical Group of Pictures
HRDHypothetical Reference Decoder
IDRInstantaneous Decoding Refresh
MBMacroblock
MBAFFMacroblock-Adaptive Frame-Field Coding
NALNetwork Abstraction Layer
PelPixel
PSNRPeak Signal to Noise Ratio
RTPRapid Transport Protocol
SADSum of Absolute Differences
SATDSum of Absolute Transformed Differences
SEISupplemental Enhancement Information
SSESum of Square Errors
SSIMStructural Similarity Index
UMHexUneven Multi-Hexagon search
VBRVariable Bit Rate
VUIVideo Usability Information

使用方式

编码句法

lencod [-h] [-d defenc.cfg] {[-f curenc1.cfg]…[-f curencN.cfg]} {[-p EncParam1=EncValue1]…[-p EncParamM=EncValueM]}

各参数含义

参数含义
-h输出各个参数的使用方式
-d使用<defenc.cfg>作为参数初始化的默认参数。如果不适用,那么就使用当前文件夹下<defenc.cfg>
-f使用<curencM.cfg>中的参数作为编码器的参数。可以使用多个文件设置不同的参数
-p将将参数< EncParamM >设置为< EncValueM >.对于< EncParamM >,不区分大小写。

使用实例:

lencod.exe lencod.exe -h 
lencod.exe -d default.cfg 
lencod.exe -f curenc1.cfg
lencod.exe -f curenc1.cfg –p InputFile="e:\data\container_qcif_30.yuv"
                          -p SourceWidth=176 -p SourceHeight=144 lencod.exe -f curenc1.cfg -p FramesToBeEncoded=30 
            -p QPFirstFrame=28 -p QPRemainingFrame=28 -p QPBPicture=30

解码句法

ldecod [-s] [-h] {[defdec.cfg] | {[-p pocScale][-i bitstream.264]… [-o output.yuv][-rreference.yuv] [-uv]}}

各参数含义

参数含义
-h输出参数使用方式
[defdec.cfg]
-sSilent decoding
-i对文件<bitstream.264>进行解码。默认是对test.264进行解码
-o将解码候的文件命名为<output.yuv>。默认为test_dec.yuv
-r将标准文件设置为<reference.yuv>,用来计算编码之后的PSNR。默认是test_rec.yuv
-p将Poc等级设置为pocScale。默认为2
-uv输出灰色色度分量,以允许在420 YUV播放器上查看输出。

使用实例:

ldecod.exe ldecod.exe -h 
ldecod.exe default.cfg 
ldecod.exe –s –i bitstream.264 
ldecod.exe –i bitstream.264 –o output.yuv –r reference.yuv 
ldecod.exe –i bitstream420.264 -uv

编码实验要求

将自两个264文件进行解码,得到相应的YUV文件

此处使用自己的两个视频文件,你的名字和豆福传。

以你的名字为例,修改decoder.cfg

##########################################################################################
# Files
##########################################################################################
InputFile             = "your_name.264"       # H.264/AVC coded bitstream
OutputFile            = "your_name.yuv"   # Output file, YUV/RGB
#RefFile               = "test_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       = 0                # 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)

随后运行解码程序:
在这里插入图片描述
最后利用yuv播放器查看转换候的结果。

最终结果如下:

你的名字豆福传
在这里插入图片描述在这里插入图片描述

将上述两个视频序列编码为.264文件

固定码率,以不同的GOP

长度及形状编码

  • GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
  • GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧

相同的GOP长度及形状,不同的码率

  • 1000kb/s, 800kb/s,400kb/s

以GOP=15,2B, 1000kb/s帧为例:
首先修改配置文件:

基本配置

##########################################################################################
# Files
##########################################################################################
InputFile             = "your_name.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     = 30      # Number of frames to be coded
FrameRate             = 30.0   # Frame Rate per second (0.1-100.0)
...
OutputFile            = "your_name_gop15_2b_1000.264"   # Bitstream
...

设置GOP组长度和B帧

IntraPeriod           = 15   # Period of I-pictures   (0=only first)
...
PrimaryGOPLength      = 15   # GOP length for redundant allocation (1-16)
...
NumberBFrames          = 2  # Number of B coded frames inserted (0=not used)
...

设置码率

RateControlEnable       = 1    # 0 Disable, 1 Enable 是否开启码率控制
Bitrate                 = 1000000 # Bitrate(bps)

随后运行编码程序即可。
在这里插入图片描述
最终结果:
在这里插入图片描述
以同样的方式对编码出其他参数的文件。
需要注意的是,如果对进行全I帧编码,则需要修改:

RCUpdateMode            = 1     # 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

用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息

以GOP=15,2B帧编码为例:

帧类型运动矢量
I帧在这里插入图片描述
B帧在这里插入图片描述
B帧在这里插入图片描述
P帧在这里插入图片描述

图像中的标记的是每个块的运动矢量,一个块的大小不定。运动矢量有红绿两种颜色。其中红色表示后向预测,绿色表示前向预测。
从上图可以看到:I帧为帧内编码,因此无运动矢量;P帧为前向预测编码;B帧为双向预测编码。

通过MB Info对话框可以得到该宏块的信息:
在这里插入图片描述
如该宏块的位置,该Slice属于I、B、P帧的何种编码帧。
在这里插入图片描述
通过像素信息模块可以知道该块的数据,以及DCT变换候的直流系数等信息。
在这里插入图片描述
通过总结,可以看到关于视频总体的信息。如使用了何种编码方式,图片的大小等。
在这里插入图片描述
Header块可以解析NAL、SPS等相关信息。

用播放器观看所生成码流的质量

GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧

GOP长度、B帧个数/码率1000kbps800kbps400kbps
GOP=15,2B帧在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=12,2B帧在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=12,无B帧在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=9,2B帧在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=4,1B帧在这里插入图片描述在这里插入图片描述在这里插入图片描述
GOP=1,全I帧在这里插入图片描述在这里插入图片描述在这里插入图片描述

生成率失真曲线

以你的名字为例,测得psnr如下

类型/码率1000kbps800kbps400kbps
GOP=15,2B帧41.6840.5937.3
GOP=12,2B帧41.0740.0736.83
GOP=12,0B帧42.7641.327.25
GOP=9.2B帧40.6129.5536.29
GOP=4,1B帧39.4638.0535.62
GOP=1,0B帧32.1331.2131.19

绘制出来表格如下:
在这里插入图片描述
由图像可知,在相同码率下,GOP组越长,PSNR越高;
在相同GOP组长度的情况下,码率越高,PSNR越高。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值