Flv封裝相關基礎內容

序言

        關於1078實時監控的另一種做法,就是自己編碼處理音視頻裸流.這種形式需要了解更多的音視頻基礎知識,因爲之前的處理過程是JavaCV幫我們做了很多東西.本文只是做個準備工作,先了解一些基礎知識在,然後才能知道該方案的可行性

參考資料:

  1. https://blog.csdn.net/u013008311/article/details/80249586
  2. https://blog.csdn.net/u013008311/article/details/80251479
  3. https://blog.csdn.net/jefry_xdz/article/details/8461343
  4. https://www.cnblogs.com/wainiwann/p/7477794.html

H264/AVC

視頻編解碼技術有兩套標準:

  1. 國際電聯(ITU-T)的標準H.263、H.263+等;
  2. ISO 的MPEG標準Mpeg1、Mpeg2、Mpeg4等等。

        H.264/AVC是兩大組織集合H.263+和Mpeg4的優點聯合推出的最新標準,最具價值的部分無疑是更高的數據壓縮比。在同等的圖像質量條件下,H.264的數據壓縮比能比H.263高2倍,比MPEG-4高1.5倍。 所以說H264和AVC 其實是指同一個東西.
 

       H.264/AVC標準是由ITU-T和ISO/IEC聯合開發的,定位於覆蓋整個視頻應用領域,包括:低碼率的無線應用、標準清晰度和高清晰度的電視廣播應用、Internet上的視頻流應用,傳輸高清晰度的DVD視頻以及應用於數碼相機的高質量視頻應用等等。
       ITU-T給這個標準命名爲H.264(以前叫做H.26L)而ISO/IEC稱它爲MPEG-4 高級視頻編碼(Advanced Video Coding,AVC),並且它將成爲MPEG-4標準的第10部分。既然AVC是當前MPEG-4標準的拓展,那麼它必然將受益於MPEG-4開發良好的基礎結構(比如系統分層和音頻等)。很明顯,作爲MPEG-4高級簡潔框架(Advanced Simple Profile,ASP)的MPEG-4 AVC將會優於當前的MPEG-4視頻壓縮標準,它將主要應用在具有高壓縮率和分層次質量需求的方向。

       H264原始碼流是一個接一個的NALU(網絡抽象層單元)租成的,每個單元之間是由 0x00 0x00 0x00 0x01 或者 0x00 0x00 0x01分割而成的,緊接着就是NALU的單元頭和數據體.(注意這裏的NALU是很重要的,因爲後面我會一定要現貨區NALU才能進行編碼操作與封裝操作[email protected],注意這裏的分隔符~~很重要,我們在收到終端的推流數據的時候就會遇到)

 

NAL

       在H.264/AVC視頻編碼標準中,整個系統框架被分爲了兩個層面:

  • 視頻編碼層面(VCL):負責有效表示視頻數據的內容
  • 網絡抽象層面(NAL):負責格式化數據並提供頭信息,保證數據適合各種信道和存儲介質上的傳輸(這個是我們要關注的重點)

       因此我們平時的每幀數據就是一個NAL單元(SPS與PPS除外)。在實際的H264數據幀中,往往幀前面帶有00 00 00 01 或 00 00 01分隔符,一般來說編碼器編出的首幀數據爲PPS與SPS,接着爲I幀…… 注意這裏的分隔符[email protected]

SPS(參數集合)

       SPS即Sequence Paramater Set,又稱作序列參數集。SPS中保存了一組編碼視頻序列(Coded video sequence)的全局參數。所謂的編碼視頻序列即原始視頻的一幀一幀的像素數據經過編碼之後的結構組成的序列。而每一幀的編碼後數據所依賴的參數保存於圖像參數集中。一般情況SPS和PPS的NAL Unit通常位於整個碼流的起始位置。但在某些特殊情況下,在碼流中間也可能出現這兩種結構,主要原因可能爲:(這個特殊情況不考慮)

  • 解碼器需要在碼流中間開始解碼;
  • 編碼器在編碼的過程中改變了碼流的參數(如圖像分辨率等)

PPS(參數集合)

      除了序列參數集SPS之外,H.264中另一重要的參數集合爲圖像參數集Picture Paramater Set(PPS)。通常情況下,PPS類似於SPS,在H.264的裸碼流中單獨保存在一個NAL Unit中,只是PPS NAL Unit的nal_unit_type值爲8;而在封裝格式中,PPS通常與SPS一起,保存在視頻文件的文件頭中。(這個是我們的1078的環境,不考慮真實環境)

解析H264數據

最上面圖的碼流對應的數據來層層分析,以00 00 00 01分割之後的下一個字節就是NALU類型,將其轉爲二進制數據後,解讀順序爲從左往右算,如下:

  1. 第1位禁止位,值爲1表示語法出錯
  2. 第2~3位爲參考級別
  3. 第4~8爲是nal單元類型(單元類型如下圖所示)

例如上面00000001後有67,68以及65

其中0x67的二進制碼爲:
0110 0111
4-8爲00111,轉爲十進制7,參考第二幅圖:7對應序列參數集SPS

其中0x68的二進制碼爲:
0110 1000
4-8爲01000,轉爲十進制8,參考第二幅圖:8對應圖像參數集PPS

其中0x65的二進制碼爲:
0110 0101
4-8爲00101,轉爲十進制5,參考第二幅圖:5對應IDR圖像中的片(I幀)

所以判斷是否爲I幀的算法爲: (NALU類型  & 0001  1111) = 5   即   NALU類型  & 31 = 5

 

 

 

--------------------------------------------------未完待續----------------------------------------

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章