H.264编解码实验

原理

概述

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

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

特点

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

流程图

编码器

H.264编解码实验_第1张图片

解码器

H.264编解码实验_第2张图片

编解码器输入参数说明

H.264编解码实验_第3张图片

缩写

缩写 全称
AVC Advanced Video Codec
CABAC Context-based Adaptive Binary Arithmetic Coding
CAVLC Context-based Adaptive Variable Length Coding
CBR Constant Bit Rate
DPB Decoded Picture Buffer
EPZS Enhanced Predictive Zonal Search
FFS Fast Full Search
FME Fast Motion Estimation
FRExt Fidelity Range Extension
FS Full Search
GOP Group of Pictures
HGOP Hierarchical Group of Pictures
HRD Hypothetical Reference Decoder
IDR Instantaneous Decoding Refresh
MB Macroblock
MBAFF Macroblock-Adaptive Frame-Field Coding
NAL Network Abstraction Layer
Pel Pixel
PSNR Peak Signal to Noise Ratio
RTP Rapid Transport Protocol
SAD Sum of Absolute Differences
SATD Sum of Absolute Transformed Differences
SEI Supplemental Enhancement Information
SSE Sum of Square Errors
SSIM Structural Similarity Index
UMHex Uneven Multi-Hexagon search
VBR Variable Bit Rate
VUI Video Usability Information

使用方式

编码句法

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

各参数含义

参数 含义
-h 输出各个参数的使用方式
-d 使用作为参数初始化的默认参数。如果不适用,那么就使用当前文件夹下
-f 使用中的参数作为编码器的参数。可以使用多个文件设置不同的参数
-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]
-s Silent decoding
-i 对文件进行解码。默认是对test.264进行解码
-o 将解码候的文件命名为。默认为test_dec.yuv
-r 将标准文件设置为,用来计算编码之后的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)

随后运行解码程序:
H.264编解码实验_第4张图片
最后利用yuv播放器查看转换候的结果。

最终结果如下:

你的名字 豆福传
H.264编解码实验_第5张图片 H.264编解码实验_第6张图片

将上述两个视频序列编码为.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)

随后运行编码程序即可。
H.264编解码实验_第7张图片
最终结果:
H.264编解码实验_第8张图片
以同样的方式对编码出其他参数的文件。
需要注意的是,如果对进行全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帧 H.264编解码实验_第9张图片
B帧 H.264编解码实验_第10张图片
B帧 H.264编解码实验_第11张图片
P帧 H.264编解码实验_第12张图片

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

通过MB Info对话框可以得到该宏块的信息:
H.264编解码实验_第13张图片
如该宏块的位置,该Slice属于I、B、P帧的何种编码帧。
H.264编解码实验_第14张图片
通过像素信息模块可以知道该块的数据,以及DCT变换候的直流系数等信息。
H.264编解码实验_第15张图片
通过总结,可以看到关于视频总体的信息。如使用了何种编码方式,图片的大小等。
H.264编解码实验_第16张图片
Header块可以解析NAL、SPS等相关信息。

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

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

GOP长度、B帧个数/码率 1000kbps 800kbps 400kbps
GOP=15,2B帧 H.264编解码实验_第17张图片 H.264编解码实验_第18张图片 H.264编解码实验_第19张图片
GOP=12,2B帧 H.264编解码实验_第20张图片 H.264编解码实验_第21张图片 H.264编解码实验_第22张图片
GOP=12,无B帧 H.264编解码实验_第23张图片 H.264编解码实验_第24张图片 H.264编解码实验_第25张图片
GOP=9,2B帧 H.264编解码实验_第26张图片 H.264编解码实验_第27张图片 H.264编解码实验_第28张图片
GOP=4,1B帧 H.264编解码实验_第29张图片 H.264编解码实验_第30张图片 H.264编解码实验_第31张图片
GOP=1,全I帧 H.264编解码实验_第32张图片 H.264编解码实验_第33张图片 H.264编解码实验_第34张图片

生成率失真曲线

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

类型/码率 1000kbps 800kbps 400kbps
GOP=15,2B帧 41.68 40.59 37.3
GOP=12,2B帧 41.07 40.07 36.83
GOP=12,0B帧 42.76 41.3 27.25
GOP=9.2B帧 40.61 29.55 36.29
GOP=4,1B帧 39.46 38.05 35.62
GOP=1,0B帧 32.13 31.21 31.19

绘制出来表格如下:
H.264编解码实验_第35张图片
由图像可知,在相同码率下,GOP组越长,PSNR越高;
在相同GOP组长度的情况下,码率越高,PSNR越高。

你可能感兴趣的:(数据压缩作业,信息压缩,h.264)