H264檔案的解析
阿新 • • 發佈:2019-01-10
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的解析有些麻煩(解析具體是什麼幀需要用到該方法),其他的用簡單的幾個位操作就能輕鬆應對了吧,下面講講指數哥倫布編碼的相關資訊: