H.264/AVC标准没有明确定义一个编解码器。
标准定义的是编码视频比特流的语法结构和对该比特流解码的方法。H.264标准的预测、变换、量化、熵编码等基本功能模块与前几个标准(MPEG-1, MPEG-2, MPEG-4,H.261,H.263)并无太大区别。变化主要体现在功能模块的具体细节上。
缩写 | 全称 |
---|---|
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 | 对文件 |
-o | 将解码候的文件命名为 |
-r | 将标准文件设置为 |
-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
此处使用自己的两个视频文件,你的名字和豆福传。
以你的名字为例,修改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)
最终结果如下:
你的名字 | 豆福传 |
---|---|
长度及形状编码
以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帧个数/码率 | 1000kbps | 800kbps | 400kbps |
---|---|---|---|
GOP=15,2B帧 | |||
GOP=12,2B帧 | |||
GOP=12,无B帧 | |||
GOP=9,2B帧 | |||
GOP=4,1B帧 | |||
GOP=1,全I帧 |
以你的名字为例,测得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 |
绘制出来表格如下:
由图像可知,在相同码率下,GOP组越长,PSNR越高;
在相同GOP组长度的情况下,码率越高,PSNR越高。