H.264编码调试

tech2022-07-15  152

基本参数

参数内容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意味着跟高的复杂度,更长的延时,以及误码的更大影响。

最新回复(0)