基本参数
参数内容
StartFrame编码的第一帧在原始序列的位置FramesToBeEncoded编码的帧数IntraPeriodGop长度NumberBFramesI(或P)P之间B帧的数目EnableOpenGop是否允许参考下一GOP中的参考帧(0为禁止)Bitrate码率RateControlEnable使简单的速率控制的支持,默认值为0(禁用)RCUpdateMode指定在启用RateControlEnable时所使用的速率控制算法:0是原始的JM率控制;1是对所有帧都适用的速率控制,不管它的片类型是什么;2是原始加上智能的对I和B片(包括层次)的选择;3是使用比特率统计法对I和B片的原始,混合二次速率控制
实验
调试JM18.6 H264编解码器,将输入的Annex B格式码流解码至YUV文件调整编码器参数,将解码后的YUV文件编码至不同格式的H.264文件用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息用播放器观看所生成码流的质量 生成率失真曲线
实验步骤
在encoder.cfg中修改下列参数
GOP类型IntraPeriodNumberBFrames
长度15、I(或P)P之间2帧B152长度12、I(或P)P之间2帧B122长度9、I(或P)P之间2帧B92长度4、I(或P)P之间1帧B41长度12、I(或P)P之间无B120长度1、I(或P)P之间0帧B10
设置不同的码率
设置码率为30、60、120、180、250、500
代码
# 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
实验结果
长度15、I(或P)P之间2帧B 注意:传输顺序并非是帧的顺序,应该首先传I帧和P帧
长度12、I(或P)P之间2帧B 长度9、I(或P)P之间2帧B
长度12、I(或P)P之间无B 长度1、I(或P)P之间无B
编码模式
红色为帧内编码模式(I) p帧中的宏块用到I和P模式,P模式为主(绿色代表P模式) B帧中的宏块用到I和B模式,B模式为主 ( 蓝色代表B模式 )
P、B中参考帧没有出现匹配的块,就帧内预测,所以B、P帧中都有红色的部分。
运动矢量
率失真
由图可以看出,相同码率时,gop越长图像质量越好,而相同gop长度时,码率越高图像质量越好。 当然,我们不能为了图像质量无限的增加gop长度,因为过长的gop意味着跟高的复杂度,更长的延时,以及误码的更大影响。