H264碼流打包分析
SODB 資料位元串-->最原始的編碼資料
RBSP 原始位元組序列載荷-->在SODB的後面填加了結尾位元(RBSP trailing bits 一個bit“1”)若干位元“0”,以便位元組對齊。
EBSP 擴充位元組序列載荷-- >在RBSP基礎上填加了仿校正位元組(0X03)它的原因是: 在NALU加到Annexb上時,需要填加每組NALU之前的開始碼 StartCodePrefix,如果該NALU對應的slice為一幀的開始則用4位位元組表示,ox00000001,否則用3位位元組表示
ox000001.為了使NALU主體中不包括與開始碼相衝突的,在編碼時,每遇到兩個位元組連續為0,就插入一個位元組的0x03。解碼時將0x03去掉。 也稱為脫殼操作。
h264的功能分為兩層,視頻編碼層(VCL)和網路提取層(NAL)
VCL資料即被壓縮編碼後的視頻資料序列。在VCL資料要封裝到NAL單元中之後,才可以用來傳輸或儲存。NAL儲存格式如:
| Nal頭 |
EBSP |
Nal頭 |
EBSP |
Nal頭 |
EBSP |
NAL單元
每個NAL單元是一個一定文法元素的可變長位元組字串,包括包含一個位元組的頭資訊(用來表示資料類型),以及若干整數位元組的負荷資料。一個NAL單元可以攜帶一個編碼片、A/B/C型資料分割或一個序列或映像參數集。
NAL單元按RTP序號按序傳送。其中,T為負荷資料類型,佔5bit;R為重要性指示位,佔2個bit;最後的F為禁止位,佔1bit。具體如下:
(1)NALU類型位
可以表示NALU的32種不同類型特徵,類型1~12是H.264定義的,類型24~31是用於H.264以外的,RTP負荷規範使用這其中的一些值來定義包彙總和分裂,其他值為H.264保留。
(2)重要性指示位
用於在重構過程中標記一個NAL單元的重要性,值越大,越重要。值為0表示這個NAL單元沒有用於預測,因此可被解碼器拋棄而不會有錯誤擴散;值高於0表示此NAL單元要用於無漂移重構,且值越高,對此NAL單元丟失的影響越大。
(3)禁止位
編碼中預設值為0,當網路識別此單元中存在位元錯誤時,可將其設為1,以便接收方丟掉該單元,主要 用於適應不同種類的網路環境(比如有線無線相結合的環境)。例如對於從無線到有線網關,一邊是無線非IP環境,一邊是有線網路的無位元錯誤的環境。假 設一個NAL單元到達無線那邊時,校正和檢測失敗,網關可以選擇從NAL流中去掉這個NAL單元,也可以把已知被破壞的NAL單元前傳給接收端。在這種情 況下,智能的解碼器將嘗試重構這個NAL單元(已知它可能包含位元錯誤)。而非智能的解碼器將簡單地拋棄這個NAL單元。NAL單元結構規定了用於面向分
組或用於流的傳輸子系統的通用格式。在H.320和MPEG-2系統中,NAL單元的流應該在NAL單元邊界內,每個NAL單元前加一個3位元組的起始首碼 碼。在分組傳輸系統中,NAL單元由系統的傳輸規程確定幀界,因此不需要上述的起始首碼碼。一組NAL單元被稱為一個接入單元,定界後加上定時資訊 (SEI),形成基本編碼映像。該基本編碼映像(PCP)由一組已編碼的NAL單元組成,其後是冗餘編碼映像(RCP),它是PCP同一視頻映像的冗餘表 示,用於解碼中PCP丟失情況下恢複資訊。如果該編碼視頻映像是編碼視頻序列的最後一幅映像,應出現序列NAL單元的end,表示該序列結束。一個映像序
列只有一個序列參數組,並被獨立解碼。如果該編碼映像是整個NAL單元流的最後一幅映像,則應出現流的end。
H.264採用上述嚴格的接入單元,不僅使H.264可自適應於多種網路,而且進一步提高其抗誤碼能力。序號的設定可發現丟的是哪一個VCL單元,冗餘編碼映像使得即使基本編碼映像丟失,仍可得到較“粗糙”的映像。