一、基本原理
参数 | 含义 |
---|---|
StartFrame | 编码的第一帧在原始序列的位置 |
FramesToBeEncoded | 编码的帧数,即生成的序列帧数 |
IntraPeriod | I帧周期,即Gop长度 |
FrameSkip | 跳帧数,即编码帧在原始序列中相隔的帧数 |
NumberBFrames | I(或P)P之间B帧的数目,如果将HierarchicalCoding设置为3,则会覆盖该参数 |
EnableOpenGop | 是否允许参考下一GOP中的参考帧(0为禁止) |
Bitrate | 码率(bps) |
HierarchicalCoding | B级编码(0=off,1=2层,2=2完整的层次结构,3=显式 |
RateControlEnable | 使简单的速率控制的支持,默认值为0(禁用) |
RCUpdateMode | 指定在启用RateControlEnable时所使用的速率控制算法:0是原始的JM率控制;1是对所有帧都适用的速率控制,不管它的片类型是什么;2是原始加上智能的对I和B片(包括层次)的选择;3是使用比特率统计法对I和B片的原始,混合二次速率控制(实验中应选2或3) |
二、实验要求
- 将不同的视频序列编码为.264文件
固定码率,以不同的GOP长度及形状编码
GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
相同的GOP长度及形状,不同的码率
例:300kb/s, 200kb/s,100kb/s,… - 用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
- 用播放器观看所生成码流的质量
- 生成率失真曲线
三、关键代码分析
在encoder.cfg中修改下列参数即可
1.不同Gop类型的参数设置
Gop类型 | IntraPeriod | NumberBFrames |
---|---|---|
长度15、I(或P)P之间2帧B | 15 | 2 |
长度12、I(或P)P之间2帧B | 12 | 2 |
长度9、I(或P)P之间2帧B | 9 | 2 |
长度4、I(或P)P之间1帧B | 4 | 1 |
长度12、I(或P)P之间2帧B | 12 | 0 |
长度1、I(或P)P之间两帧B | 1 | 0 |
2.不同码率设置
码率(kbps) | 30 | 60 | 120 | 180 | 250 | 500 |
---|
3.所有测试序列共同的相关参数
参数 | 数值 |
---|---|
StartFrame | 0 |
FramesToBeEncoded | 30 |
FrameSkip | 2 |
EnableOpenGop | 1 |
HierarchicalCoding | 2 |
RateControlEnable | 1 |
RCUpdateMode | 2 |
# Files
##########################################################################################
InputFile = "1mother-daughter_qcif.yuv" # Input sequence "foreman_part_qcif.yuv"
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 3******alter by zml*******
FrameRate = 30.0 # Frame Rate per second (0.1-100.0)
Enable32Pulldown = 0 # Enable 'hard' 3:2 pulldown (modifying the inpur data)
# 0 = disabled
# 1 = A, B, Bt|Cb, Ct|Db, D
# 2 = A, B, C, Ct|Db, D
SEIVUI32Pulldown = 0 # Enable 3:2 pulldown through VUI and SEI metadata signaling. Five methods are supported:
# 0 = disabled
# 1 = A, Bt|Bb, Bt|Cb, Ct|Cb, D
# 2 = A, B, C, C, D
# 3 = At|Ab, Bt|Bb, Bt|Cb, Ct|Cb, Dt|Db
# 4 = A, Bt|Bb, Bt|Cb, Ct|Db, Dt|Db
# 5 = At|Ab, Bt|Bb, Bt|Cb, Ct|Db, Dt|Db
SourceWidth = 176 # Source frame width 176******alter by zml********
SourceHeight = 144 # Source frame height144*****alter by zml*******
SourceResize = 0 # Resize source size for output
OutputWidth = 176 # Output frame width 176*****alter by zml*****
OutputHeight = 144 # Output frame height144*****alter by zml*****
ProcessInput = 0 # Filter Input Sequence
Interleaved = 0 # 0: Planar input, 1: Packed input
PixelFormat = 0 # Pixel Format for 422 packed inputs
# 0: UYVY
# 1: YUY2/YUYV
# 2: YVYU
# 3: BGR (Unsupported)
# 4: V210 (Video Clarity)
StandardRange = 0 # 0: Standard range 1: Full range (RGB input)
VideoCode = 1 # Video codes for RGB ==> YUV conversions
# 0 = NULL,
# 1 = ITU_REC709,
# 2 = CCIR_601,
# 3 = FCC,
# 4 = ITU_REC624BG,
# 5 = SMPTE_170M,
# 6 = SMPTE_240M,
# 7 = SMPTE_260M,
# 8 = ITU_REC709_EXACT
TraceFile = "1mother-daughter2.txt" # Trace file *****alter by zml*****
ReconFile = "1mother-daughter_rec2.yuv" # Reconstruction YUV file*****alter by zml******
OutputFile = "1mother-daughter2.264" # Bitstream*****alter by zml******
StatsFile = "1mother-daughter2.dat" # Coding statistics file*******alter by zml*****
NumberOfViews = 1 # Number of views to encode (1=1 view, 2=2 views)
View1ConfigFile = "encoder_view1.cfg" # Config file name for second view
##########################################################################################
……
# Encoder Control
##########################################################################################
Grayscale = 0 # Encode in grayscale (Currently only works for 8 bit YUV 420 input)
ProfileIDC = 100 # Profile IDC (66=baseline, 77=main, 88=extended; FREXT Profiles: 100=High, 110=High 10, 122=High 4:2:2, 244=High 4:4:4, 44=CAVLC 4:4:4 Intra, 118=Multiview High Profile, 128=Stereo High Profile)
IntraProfile = 0 # Activate Intra Profile for FRExt (0: false, 1: true)
# (e.g. ProfileIDC=110, IntraProfile=1 => High 10 Intra Profile)
LevelIDC = 40 # Level IDC (e.g. 20 = level 2.0)
IntraPeriod = 15 # Period of I-pictures (0=only first)0*****alter by zml******
IDRPeriod = 0 # Period of IDR pictures (0=only first)
AdaptiveIntraPeriod = 1 # Adaptive intra period
AdaptiveIDRPeriod = 0 # Adaptive IDR period
IntraDelay = 0 # Intra (IDR) picture delay (i.e. coding structure of PPIPPP... )
EnableIDRGOP = 0 # Support for IDR closed GOPs (0: disabled, 1: enabled)
EnableOpenGOP = 1 # Support for open GOPs (0: disabled, 1: enabled)0*****alter by zml******
QPISlice = 28 # Quant. param for I Slices (0-51)
QPPSlice = 28 # Quant. param for P Slices (0-51)
FrameSkip = 2 # Number of frames to be skipped in input (e.g 2 will code every third frame).0 **********alter by zml*****************************************************
# Note that this now excludes intermediate (i.e. B) coded pictures
……
# B Slices
##########################################################################################
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)7*****alter by zml******
PReplaceBSlice = 0 # Replace B-coded slices with P-coded slices when NumberBFrames>0
QPBSlice = 30 # Quant. param for B slices (0-51)
BRefPicQPOffset = -1 # Quantization offset for reference B coded pictures (-51..51)
DirectModeType = 1 # Direct Mode Type (0:Temporal 1:Spatial)
DirectInferenceFlag = 1 # Direct Inference Flag (0: Disable 1: Enable)
BList0References = 0 # B slice List 0 reference override (0 disable, N <= NumberReferenceFrames)
BList1References = 1 # B slice List 1 reference override (0 disable, N <= NumberReferenceFrames)
# 1 List1 reference is usually recommended for normal GOP Structures.
# A larger value is usually more appropriate if a more flexible
# structure is used (i.e. using HierarchicalCoding)
BReferencePictures = 0 # Referenced B coded pictures (0=off, 1=B references for secondary layer, 2=B references for primary layer)
HierarchicalCoding = 2 # B hierarchical coding (0= off, 1= 2 layers, 2= 2 full hierarchy, 3 = explicit)*********alter by zml*******
HierarchyLevelQPEnable = 1 # Adjust QP based on hierarchy level (in increments of 1). Overrides BRefPicQPOffset behavior.(0=off, 1=on)
……
#################Rate control
##########################################################
RateControlEnable = 1 # 0 Disable, 1 Enable0**************alter by zml***************
Bitrate = 30000 # Bitrate(bps)45020*********alter by zml**********
InitialQP = 0 # Initial Quantization Parameter for the first I frame
# InitialQp depends on two values: Bits Per Picture,
# and the GOP length
BasicUnit = 0 # Number of MBs in the basic unit
# should be a fraction of the total number
# of MBs in a frame ("0" sets a BU equal to a frame)
ChannelType = 0 # type of channel( 1=time varying channel; 0=Constant channel)
RCUpdateMode = 2 # Rate Control type. Modes supported :0**********alter by zml**********
# 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类型,截图中展示了编码中的帧重排和跳帧
IBBPBBPBBPBBPBB
IBBPBBPBBPBB
IBBPBBPBB
IBPB
IPPPPPPPPPPP
IIIIIIIIII……
- 编码模式
红色为帧内编码模式(I)
p帧中的宏块用到I和P模式,P模式为主(绿色代表P模式)
B帧中的宏块用到I和B模式,B模式为主 ( 蓝色代表B模式 )
P、B中参考帧没有出现匹配的块,就帧内预测,所以B、P帧中都有红色的部分。
运动矢量
根据运动矢量可以看出车向左行驶,因为背景的运动矢量向右。失真分析
重建序列:
GOP类型 | 30kbps | 500kbps |
---|---|---|
15 2B | ||
12 2B |