h264碼流檔案通過計算first mb in

2021-07-25 04:03:51 字數 1736 閱讀 3549

摘抄**:

首先nal句法,片頭句法以及nal_unit_type語義必須知道:

簡單的區分幀的方法就是讀取檔案的時候與0x00 0x00 0x00 0x01比較,如果相等認為是乙個片,再讀取乙個位元組就對應表6.1的forbidden_zero_bit(1bit),nal_ref_idc(2bit),nal_unit_type(5bit),nal_unit_type值根據表6.20可以確定該幀型別,對於7,8是沒有first_mb_in_slice,可以一直讀到下乙個0x00 0x00 0x00 0x01這之間的資料都是引數集資料。對於1,5都是有first_mb_in_slice並且每一幀第一片的first_mb_in_slice都是0,這對於分成多片的一幀資料的獲取是很有用的。

下面是指數哥倫布碼的解析:來自

解析k階指數哥倫布碼時,首先從位元流的當前位置開始尋找第乙個非零位元,並將找到的零位元個數記為leadingzerobits,然後根據leadingzerobits計算codenum。用偽**描述如下:

first_mb_in_slice是需要對h264通過expgolomb編碼過的一串2進製數進行expgolomb解碼得到,通過在網上多方查詢並結合h264的檔案分析,終於找到了計算方法,現在跟大家分享一下,有不對的地方歡迎指正。

i幀情況:

如下圖所示:

88 80 = 1000 1000 1000 0000      假設階數為0,那麼leadingzerobits=0, codenum(first_mb_in_slice) = 1-1+0=0

06 62 = 0000 0110 0110 0010      假設階數為0,那麼leadingzerobits=5, codenum(first_mb_in_slice)=2exp(5)-2exp(0)+10011(2進製)=32-1+19=50

p幀情況:

如下圖所示:

9a 00 = 1001 1010 0000 0000      假設階數為0,那麼leadingzerobits=0, codenum(first_mb_in_slice) = 1-1+0=0

03 29 = 0000 0011 0010 1001      假設階數為0,那麼leadingzerobits=6, codenum(first_mb_in_slice)=2exp(6)-2exp(0)+100101(2進製)=64-1+37=100

其實對於0階而言,最簡單的方法就是判斷該位元組第乙個bit是否為1,如果是1,codenum(first_mb_in_slice),肯定為0,就是一幀的第一片。

原理解說完畢,希望對大家有所幫助。具體計算first_mb_in_slice的**網上應該比較多,也可以參考ffmpeg的。

H 264碼流的幀率計算

vui parameters present flag 等於1 表示存在如附錄e 提到的vui parameters 語法結構。vui parameters 中,timing info present flag為1,表示包含num units in tick time scale和fixed fra...

H 264碼流結構

a 對照 h.263 的碼流結構 h.263 定義的碼流結構是分級結構,共四層。自上而下分別為 影象層 picture layer 塊組層 gob layer 巨集塊層 macroblock layer 和塊層 block layer psctr ptype pquant cpmpsbi trbdb...

H 264碼流結構

a 對照 h.263的碼流結構 h.263定義的碼流結構是分級結構,共四層。自上而下分別為 影象層 picture layer 塊組層 gob layer 巨集塊層 macroblock layer 和塊層 block layer psc tr ptype pquant cpmpsbi trbdbq...