1. 程式人生 > >H264碼流打包分析(zz)

H264碼流打包分析(zz)

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單元,冗餘編碼影象使得即使基本編碼影象丟失,仍可得到較“粗糙”的影象。