幀內解碼時,在解碼端,首先通過當前巨集塊左邊、上邊已經解碼完成的巨集塊使用當前巨集塊的**模式(**模式計算過程請參見我的**《h.264
「本群原創資料」目錄中)得到當前巨集塊的畫素**值。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差。最後將殘差和**值加在一起就得到重構的畫素值。如果當前巨集塊的左邊或者右邊的巨集塊不存在(即當前巨集塊為影象邊界上的巨集塊),那麼其**值全部為128
。幀間解碼時,在解碼端,首先對碼流進行解碼得到當前巨集塊的參考幀,然後通過當前巨集塊周圍巨集塊計算運動向量**值(具體方法見畢厚傑書99
頁,標準中也有,但我一時不知道在什麼地方了)。然後通過對碼流進行解碼得到當前巨集塊的運動向量殘差。將運動向量殘差與運動向量**值相加得到實際的運動向量。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差(如果當前巨集塊有畫素殘差的話)。然後通過參考幀與上面計算得到的mv
計算出當前巨集塊的畫素**值。再將畫素**值與畫素殘差相加就得到當前巨集塊的重構。
說明:1
、以上過程為jm86
的解碼過程。並不一定所有**都按照這個流程; 2
、上面說的運動向量**值的計算過程實際是以4*4
塊為單位,參考幀也是針對4*4
塊做的。這裡寫成巨集塊主要是方便大家理解。
rate-distortion optimization
的一種方法。比如h.264
裡好多mode 8x8 16x16 i4x4 i16
在給定的條件下,哪個是最好的?
distortion
是指選用candidate mode
產生的失真,rate
是用這個mode
需要的rate.
他們換算成rdcost = distortion + lamda * rate.
兩個mode
誰的rdcost
低就選誰,其中的數學原理是條件極值轉非條件極值。
jm 裡用的rdo
是比較經典的方法。最早是gary j.sullivan
做的參見ieee signal processing magazine 1998 nov. "rate-distortion optimization for video compression" rdo
的經典。h264
裡的rdo
還可參考csvt h.264 special issue.
在h.264
裡面當前幀屬於哪個slice
的決定形式是多種多樣的,對於jm
中的碼流中,一般一幀圖象就認為是乙個slice
,那麼如果當前幀是乙個i
幀,那麼它就屬於乙個i slice.
這時整個frame
的為乙個slice.
但是具體我們用什麼樣的方式來進行slice type
的決策呢,這也是乙個問題。我們看一下t264
裡面是如何處理這個問題的。
在t264
中,如果我們設定了,use_scenedetect
的話,當前的slice
種類是由當前幀的幀號與設定的idrframe,iframe
跟bframe
相關的,如果frame_no%idrframe==0
的話,那麼說明當前幀是屬於乙個idr slice
的,如果frame_no%iframe==0
的話,該幀屬於乙個i slice.
如果上面的情況不滿足那麼是屬於p slice
或b slice.
由於碼流中只有如下幾種型別:0) i p p p ..... i p p p 1) i b p b p.....b p b p 2) i b b p b b p.....b b p i b b p
,所以如果frame_no%(bframe+1)==0
的話,就屬於p slice,
如果不是的話屬於b slice.
如果沒有使用use_scenedetect
的話,是用meanalysis
來決定當前屬於什麼slice
的。這種形式是動態式地決定是不是要加入乙個i slice
。決定流程如下:如果我們達到了我們在config
裡面設定的iframe interval
的話,當前幀就是乙個i slice.
我們設定乙個intra_threshold,
對幀中的每乙個巨集塊進行**,來計算sad.
這個過程因為計算量比較大,所以使用了簡化演算法,首先用前一幀的mv
做**值,計算sad
,如果這個值大於我們設定的search_threshold
的話,說明上一幀的mv
已不適合做當前幀的**,我們會使用乙個簡化的diamond search
來簡單地找一下當前巨集塊的mv,
進行sad
計算。整個幀的sad
計算結束之後,我們與intra_threshold
進行比較,如果sad
大的話,這一幀為i slice
中的一幀,如果小的話,我們認為它是乙個p
或b幀。對於當前幀是p
還是b幀還是用上面的方法進行。
H 264 中的相關問題
幀內解碼時,在解碼端,首先通過當前巨集塊左邊 上邊已經解碼完成的巨集塊使用當前巨集塊的 模式 模式計算過程請參見我的 h.264 本群原創資料 目錄中 得到當前巨集塊的畫素 值。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差。最後將殘差和 值加在一起就得到重構的畫素值。如果當前巨集塊的左邊或者右邊的...
H264相關知識
1 基本概念 p frame 前向 編碼幀又稱predictive frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫 幀 b frame 雙向 內插編碼幀 又稱bi directional interpolated prediction frame,既考...
H264 編碼 打包 解碼相關知識
2 pes流 packet elementary stream 也叫打包的基本碼流,是將基本的碼流es流根據需要分成長度不等的資料報,並加上包頭就形成了打包的基本碼流pes流.4 i frame 幀內編碼幀 又稱intra picture,i 幀通常是每個 gop mpeg i幀可以看成是乙個影象經...