H.264編碼原理簡介
H.264是由ITU-T視訊編碼專家組(VCEG)和ISO/IEC運動圖像專家組(MPEG)聯合組成的聯合視訊組(JVT,Joint VideoTeam)提出的新一代數字視訊壓縮标準。
其優點在于注重對移動和IP網絡的适應,采用分層技術,從形式上将編碼和信道隔離開來,實質上是在源編碼器算法中更多地考慮到信道的特點,編碼原理可由如下流程表示:
解碼流程:
除此之外,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執行檔案進行解碼:
用yuvviewer檢視生成的yuv檔案
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打開:
圖中紅色條柱表示I幀,藍色條柱表示P幀,綠色條柱表示B幀,通過碼流分析軟體可以清晰的看到編碼後檔案的幀結構,圖中所顯示的為編解碼時幀重排的順序:IPBBPBBPBBPB
選取四幀(I\P\B\B)進行進一步分析:
圖中可以看到,I幀為幀内預測編碼,沒有運動矢量;P幀為前向幀間預測,紅色條紋表示其運動矢量;B幀為雙向幀間預測,紅色條紋表示前向預測運動矢量,綠色條紋表示後向預測運動矢量;背景變化較少,幾乎無運動矢量。
碼流品質分析
從理論分析可以得知,相同的GOP長度及形狀,碼率越高,視訊品質越高;相同的碼率,GOP越長,視訊品質越高。
幀結構\ 碼率 | 1000kb/s | 800kb/s | 400kb/s |
---|---|---|---|
GOP=15,2B | |||
GOP=12,2B | |||
GOP=9,2B | |||
GOP=4,1B | |||
GOP=12,0B | |||
GOP=1,全I |
肉眼的觀感基本與理論符合,相同幀結構,不同碼率下的視訊噪聲差異較為明顯,而相同碼率,不同幀結構下,肉眼觀感差異不大。
生成率失真曲線
計算PSNR,繪制率失真曲線如下:
PSNR越高,表明視訊的品質越好。