H264結構圖:
H264視頻壓縮後會成爲一個序列幀,幀裏包含圖像,圖像分爲不少片,每一個片能夠分爲宏塊,每一個宏塊由許多子塊組成 H264結構中,一個視頻圖像編碼後的數據叫作一幀,一幀由一個片(slice)或多個片組成,一個片由一個或多個宏塊(MB)組成,一個宏塊由16x16的yuv數據組成。宏塊做爲H264編碼的基本單位。算法
- 場和幀:視頻的一場或者一幀能夠用來產生一個編碼圖像。在電視中,每一個電視幀都是經過掃描屏幕兩次而產生的,第二個掃描的線條恰好填滿第一次掃描所留下的縫隙。每一個掃描即稱爲一個場。所以 30 幀/秒的電視畫面實際上爲 60 場/秒
- 片:每一個圖像中,若干個宏塊被排列成片。片的目的:爲了限制誤碼的擴散和傳輸,使編碼片相互間保持獨立。片共有5種類型:I片(只包含I宏塊)、P片(P和I宏塊)、B片(B和I宏塊)、SP片(用於不一樣編碼流之間的切換)和SI片(特殊類型的編碼宏塊)。
- 宏塊:一個編碼圖像首先要劃分紅多個塊(4x4 像素)才能進行處理,顯然宏塊應該是整數個塊組成,一般宏塊大小爲16x16個像素。宏塊分爲I、P、B宏塊,I宏塊只能利用當前片中已解碼的像素做爲參考進行幀內預測;P宏塊能夠利用前面已解碼的圖像做爲參考圖像進行幀內預測;B宏塊則是利用先後向的參考圖形進行幀內預測
H264編碼分層
- NAL層:(Network Abstraction Layer,視頻數據網絡抽象層): 它的做用是H264只要在網絡上傳輸,在傳輸的過程每一個包以太網是1500字節,而H264的幀每每會大於1500字節,因此要進行拆包,將一個幀拆成多個包進行傳輸,全部的拆包或者組包都是經過NAL層去處理的。
- VCL層:(Video Coding Layer,視頻數據編碼層): 對視頻原始數據進行壓縮
碼流的基本概念
- SODB:(String of Data Bits,原始數據比特流):由VCL層產生,數據長度不必定是8的倍數,因此處理起來比較麻煩
- RBSP:(Raw Byte Sequence Payload,SODB+trailing bits,編碼後的數據流):算法是在SODB最後一位補1,不按字節對齊補0,若是補齊0,不知道在哪裏結束,因此補1,若是不夠8位則按位補0
- EBSP:(Encapsulate Byte Sequence Payload):生成編碼後的數據流以後,咱們還要在每一個幀以前加一個起始位,須要開發者人爲添加。起始位通常是十六進制的0001。可是在整個編碼後的數據裏,可能會出來連續的2個0x00。那這樣就與起始位產生了衝突.那怎麼處理了? H264規範裏說明若是處理2個連續的0x00,就額外增長一個0x03 。這樣就能預防壓縮後的數據與起始位產生衝突
- NALU: (NAL Header(1B)+EBSP).NALU就是在EBSP的基礎上加1B的網絡頭.
NALU解析
-
NALU頭結構:NALU類型(5bit)、重要性指示位(2bit)、禁止位(1bit):第1位爲禁位,默認固定爲0,若是接收到的爲1,那麼就須要丟棄該單元;第2-3位表示重要性,00表示最不重要,11表示最重要,咱們能夠在解碼來不及的狀況下捨棄一些不重要的單元;第4-8位用來表示NALU的類型網絡
-
NALU類型:1~12由H.264使用,24~31由H.264之外的應用使用:類型圖以下: ide
-
切片與宏塊的關係:每一個切片包括切片頭和切片數據,每一個切片數據包括了不少宏塊。每一個宏塊包括了宏塊類型、宏塊預測、殘差效果: 編碼
-
切片頭:包含了一組片的信息,好比片的數量,順序等等3d
H264碼流分層結構圖