天天看點

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

H.264編碼原理簡介

H.264是由ITU-T視訊編碼專家組(VCEG)和ISO/IEC運動圖像專家組(MPEG)聯合組成的聯合視訊組(JVT,Joint VideoTeam)提出的新一代數字視訊壓縮标準。

其優點在于注重對移動和IP網絡的适應,采用分層技術,從形式上将編碼和信道隔離開來,實質上是在源編碼器算法中更多地考慮到信道的特點,編碼原理可由如下流程表示:

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

解碼流程:

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

除此之外,H.264引進了更先進的子產品:

幀内預測

在空間域進行幀内預測,提高幀内編碼的精确度。

運動估計與運動補償

不同尺寸的塊和形狀,高分辨率的子像素運動估計和選擇多個參考幀。

DCT變換

H.264使用整數的DCT變換,計算更簡便,沒有精度損失。

去塊效應濾波

為消除塊效應,增加了自适應消塊濾波器。

熵編碼技術

通用變長編碼(UVLC, universal variable lengthcoding)、基于上下文的自适應變長碼編碼(CAVLC,context-based adaptive variable length coding)或基于上下文的自适應二進制算術編碼(CABAC, context-based adaptive binary arithmetic coding)。

H.264編解碼實驗

實驗内容:參考JM Reference Software Manual(JVT-AE010)文檔,自主學習分析設定編解碼器參數。

H.264解碼

實驗要求:将自行選擇的.264檔案進行解碼,得到相應的.YUV檔案。

H.264解碼參數輸入在所給的解碼器工程jm_vc10.sln 的 decoder.cfg中,所需要自行設定的參數有:

InputFile             = "highway_qcif.264"       # H.264/AVC coded bitstream
OutputFile            = "highway_qcif.yuv"   # Output file, YUV/RGB
RefFile               = "highway_qcif.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)
           

通過修改InputFile與OutputFile參數設定需要解碼和生成的檔案,WriteUV決定了色度分量的采樣方式,采用預設即可,其他參數也如此。

修改參數後運作ldecod.exe執行檔案進行解碼:

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

用yuvviewer檢視生成的yuv檔案

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

H.264編碼

實驗要求:将.yuv檔案編碼成.264檔案,采用兩種對照:

  • 固定碼率,以不同的GOP長度及形狀編碼,如GOP=15,2B幀;GOP=12,2B幀;GOP=4,1B幀;GOP=1,全I幀……
  • 固定GOP長度及形狀,不同的碼率編碼,如1000kb/s,800kb/s,400kb/s……

以實驗中使用的miss.yuv為例,在encoder.cfg檔案中修改編碼參數:

InputFile             = "miss.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     = 22      # Number of frames to be coded
FrameRate             = 30.0   # Frame Rate per second (0.1-100.0)
、、、、、
SourceWidth           = 352    # Source frame width
SourceHeight          = 288    # Source frame height
SourceResize          = 0      # Resize source size for output
OutputWidth           = 352    # Output frame width
OutputHeight          = 288    # Output frame height
、、、、
OutputFile            = "miss_gop1_0b_10k.264"           # Bitstream
           

通過InputFile 、OutputFile 設定輸入和輸出的檔案,FramesToBeEncoded決定了編碼的幀數,根據輸入檔案的幀數自行設定;SourceWidth 、SourceHeight 和 OutputWidth 、OutputHeight 分别為輸入、輸出檔案的寬高。

EnableIDRGOP          = 1   # Support for IDR closed GOPs (0: disabled, 1: enabled)
IntraPeriod           = 0   # Period of I-pictures   (0=only first)
IDRPeriod             = 1   # Period of IDR pictures (0=only first)
NumberBFrames          = 0  # Number of B coded frames inserted (0=not used)
PrimaryGOPLength       = 12 # GOP length for redundant allocation (1-16)
           

将EnableIDRGOP設定為1,以啟用IDR幀

IntraPeriod 為GOP中I幀的周期,設定為0表示隻有第一幀為I幀;IDRPeriod 則決定了GOP中IDR幀的周期。IDR幀為一種特殊的I幀,但一個GOP組中隻有一個IDR幀,通常放在GOP的第一個I幀中,以區分GOP組。為了友善本次實驗,将IntraPeriod設為0,IDRPeriod 則為 GOP長度。

NumberBFrames 為B幀的數量,決定了GOP的結構。

PrimaryGOPLength 初始化GOP長度,設定 PrimaryGOPLength= IDRPeriod

RateControlEnable       = 1     # 0 Disable, 1 Enable
Bitrate                 = 1000000 # Bitrate(bps)
           

将RateControlEnable 設為1 以啟用碼率控制,Bitrate 則為設定的碼率。

參數設定完成後運作 lencod.exe 執行檔案,得到編碼後的檔案。

以GOP=12,2B,1000kb/s的檔案為例,用碼流分析軟體ESEYE打開:

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

圖中紅色條柱表示I幀,藍色條柱表示P幀,綠色條柱表示B幀,通過碼流分析軟體可以清晰的看到編碼後檔案的幀結構,圖中所顯示的為編解碼時幀重排的順序:IPBBPBBPBBPB

選取四幀(I\P\B\B)進行進一步分析:

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

圖中可以看到,I幀為幀内預測編碼,沒有運動矢量;P幀為前向幀間預測,紅色條紋表示其運動矢量;B幀為雙向幀間預測,紅色條紋表示前向預測運動矢量,綠色條紋表示後向預測運動矢量;背景變化較少,幾乎無運動矢量。

碼流品質分析

從理論分析可以得知,相同的GOP長度及形狀,碼率越高,視訊品質越高;相同的碼率,GOP越長,視訊品質越高。

幀結構\ 碼率 1000kb/s 800kb/s 400kb/s
GOP=15,2B
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
GOP=12,2B
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
GOP=9,2B
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
GOP=4,1B
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
GOP=12,0B
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
GOP=1,全I
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗
H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

肉眼的觀感基本與理論符合,相同幀結構,不同碼率下的視訊噪聲差異較為明顯,而相同碼率,不同幀結構下,肉眼觀感差異不大。

生成率失真曲線

計算PSNR,繪制率失真曲線如下:

H.264編解碼實驗H.264編碼原理簡介H.264編解碼實驗

PSNR越高,表明視訊的品質越好。

繼續閱讀