1、基本概念
p frame: 前向**編碼幀又稱predictive-frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫**幀;
b frame: 雙向**內插編碼幀 又稱bi-directional interpolated prediction frame,既考慮與源影象序列前面已編碼幀,也顧及源影象序列後面已編碼幀之間的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫雙向**幀;
dts:decode time stamp。dts主要是標識讀入記憶體中的二進位製流在什麼時候開始送入解碼器中進行解碼。在沒有b幀存在的情況下dts的順序和pts的順序應該是一樣的。
sps、pps、idr:在實際的h264資料幀中,往往幀前面帶有00 00 00 01 或 00 00 01分隔符,根據分隔符後的nalu型別資訊,獲取該幀為sps(序列引數集sequence parameter set)、pps(影象引數集picture parameter set)、idr(即時解碼器重新整理)等具體型別。
ipb幀的不同:
兩個i frame之間形成乙個gop,在x264中同時可以通過引數來設定bf的大小,即:i 和p或者兩個p之間b的數量。
通過上述基本可以說明如果有b frame 存在的情況下乙個gop的最後乙個frame一定是p.
dts和pts的不同:
idr和i幀的不同:
i和idr幀都是使用幀內**的。它們都是同乙個東西而已,在編碼和解碼中為了方便,要首個i幀和其他i幀區別開,所以才把第乙個首個i幀叫idr,這樣就方便控制編碼和解碼流程。idr幀的作用是立刻重新整理,使錯誤不致傳播,從idr幀開始,重新算乙個新的序列開始編碼。而i幀不具有隨機訪問的能力,這個功能是由idr承擔。idr會導致dpb(參考幀列表——這是關鍵所在)清空,而i不會。idr影象一定是i影象,但i影象不一定是idr影象。乙個序列中可以有很多的i影象,i影象之後的影象可以引用i影象之間的影象做運動參考。乙個序列中可以有很多的i影象,i影象之後的圖象可以引用i影象之間的影象做運動參考。
例子:
下面給出乙個gop為15的例子,其解碼的參照frame及其解碼的順序都在裡面:
如上圖:i frame 的解碼不依賴於任何的其它的幀.而p frame的解碼則依賴於其前面的i frame或者p frame.b frame的解碼則依賴於其前的最近的乙個i frame或者p frame 及其後的最近的乙個p frame.
如何判斷幀型別(是影象參考幀還是i、p幀等)?
nalu型別是我們判斷幀型別的利器,從官方文件中得出如下圖:
我們還是接著看最上面圖的碼流對應的資料來層層分析,以00 00 00 01分割之後的下乙個位元組就是nalu型別,將其轉為二進位制資料後,解讀順序為從左往右算,如下:
(1)第1位禁止位,值為1表示語法出錯
(2)第2~3位為參考級別
(3)第4~8為是nal單元型別
例如上面00000001後有67,68以及65
所以判斷是否為i幀的演算法為: (nalu型別 & 0001 1111) = 5 即nalu型別& 31 = 5
比如0x65 & 31 = 5
H264 編碼 打包 解碼相關知識
2 pes流 packet elementary stream 也叫打包的基本碼流,是將基本的碼流es流根據需要分成長度不等的資料報,並加上包頭就形成了打包的基本碼流pes流.4 i frame 幀內編碼幀 又稱intra picture,i 幀通常是每個 gop mpeg i幀可以看成是乙個影象經...
H264 編碼 打包 解碼相關知識
本文 2 pes流 packet elementary stream 也叫打包的基本碼流,是將基本的碼流es流根據需要分成長度不等的資料報,並加上包頭就形成了打包的基本碼流pes流.5 p frame 前向 編碼幀又稱predictive frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資...
H 264 中的相關問題
幀內解碼時,在解碼端,首先通過當前巨集塊左邊 上邊已經解碼完成的巨集塊使用當前巨集塊的 模式 模式計算過程請參見我的 h.264 本群原創資料 目錄中 得到當前巨集塊的畫素 值。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差。最後將殘差和 值加在一起就得到重構的畫素值。如果當前巨集塊的左邊或者右邊的...