1. 程式人生 > >H264檔案的解析

H264檔案的解析

Bi-directional predicted frames/slices(B-frames/slices)(雙向預測幀/條帶(B-幀/條帶))

1. 為了解碼的需要,要優先解碼一些其他圖片(幀)
2. 可能包含影象資料或運動向量偏移量或者兩者的組合
    a. 舊的標準有一個關於整個幀的全域性運動補償向量
    b. 一些標準關於每個巨集塊都有一個運動補償向量
3. 一些標準允許每個巨集塊使用兩個運動補償向量(雙向預測)
4. 在舊的設計標準中(比如MPEG-2),B-幀從不用來作為其他圖片(幀)的預測引用。因此,B-幀可以用一個稍低質量的編碼(編碼量少的)來完成,因為一些細節的丟失不會對預測後續圖片(幀)的質量帶來影響。
5. 在H.264檔案中,有可能被作為解碼其他圖片(幀)的引用(由編碼器決定)
6. 在舊的設計標準中(比如MPEG-2),在解碼過程中會使用前面的2幀解碼圖片作為引用,並且需要其中一幀在B-幀之前顯示,另外一幀在B-幀之後顯示。
7. 在H.264檔案中,能夠使用1,2或者更多先前解碼的圖片(幀)作為解碼過程中的引用,並且相對於被用來做預測的圖片幀,該幀能夠以任意順序顯示。
8. 通常,相對於編碼I-幀 和 P-幀來說,編碼該幀需要更少的位元位數。

有了已上的基本知識以後,我們已經瞭解到I-幀是關鍵幀,並且是佔空間最多的幀,因為很多資料都是內編碼的,而P-幀是預測幀,需要藉助前面的幀來作為引用,從而得到完整的資料,而B-幀是雙向預測幀,需要藉助前面和後面的幀來作為引用。因此一般來說佔用空間排序:I-幀 > P-幀 > B-幀 (I-幀佔用空間最多)。

對於如何解析幀型別(I,P還是B幀等等),需要用到nal_unit_type這一欄位,在Nalu中它佔據第一個位元組的3~8位,Nalu的第一個位元組(忽略起始碼startcode:0x000001 or 0x00000001)如下: 
forbidden_zero_bit: 1 bit 
nal_ref_idc: 2 bit 
nal_unit_type: 5 bit 
官方文件也給出了語義解析,以虛擬碼的形式給出的: 
這裡寫圖片描述


後面的f(1),u(2),u(5)是代表要使用的解析方法,前面加深的粗體forbidden_zero_bit,nal_ref_idc,nal_unit_type稱為syntax_element,語法元素,即:解析這些語法元素要用到後面的f(1),u(2),u(5)方法,下面是官方文件中給出的解析方法: 
這裡寫圖片描述
這裡寫圖片描述
這裡面的解析方法,個人感覺只有Exp-Golomb-coded的解析有些麻煩(解析具體是什麼幀需要用到該方法),其他的用簡單的幾個位操作就能輕鬆應對了吧,下面講講指數哥倫布編碼的相關資訊: