<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    RTP封裝h264

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    網絡抽象層單元類型 (NALU):

    NALU頭由一個字節組成,它的語法如下:

          +---------------+
          |0|1|2|3|4|5|6|7|
          +-+-+-+-+-+-+-+-+
          |F|NRI|  Type   |
          +---------------+

    F: 1個比特.
      forbidden_zero_bit. 在 H.264 規范中規定了這一位必須為 0.

    NRI: 2個比特.
      nal_ref_idc. 取00~11,似乎指示這個NALU的重要性,如00的NALU解碼器可以丟棄它而不影響圖像的回放. 

    Type: 5個比特.
      nal_unit_type. 這個NALU單元的類型.簡述如下:

      0     沒有定義
      1-23  NAL單元  單個 NAL 單元包
      24    STAP-A   單一時間的組合包
      25    STAP-B   單一時間的組合包
      26    MTAP16   多個時間的組合包
      27    MTAP24   多個時間的組合包
      28    FU-A     分片的單元
      29    FU-B     分片的單元
      30-31 沒有定義

    h264僅用1-23,24以后的用在RTP H264負載類型頭中

     

    RTP 頭的結構:

           0                   1                   2                   3
           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |V=2|P|X|  CC   |M|     PT      |       sequence number         |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                           timestamp                           |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |           synchronization source (SSRC) identifier            |
          +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
          |            contributing source (CSRC) identifiers             |
          |                             ....                              |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

          負載類型 Payload type(PT): 7bits
    rfc里面對一些早期的格式定義了這個payload type。但是后來的,如h264并沒有分配,那就用96來代替。因此現在96以上都不表示特定的格式,具體表示什么要用sdp或者其他協議來協商。

          序列號 Sequence number(SN): 16bits
          時間戳 Timestamp: 32bits

     

    上面介紹了NALU和RTP header的基本結構,下面介紹的全部都是RTP PayLoad的部分

    Rtp負載第一個字節的結構如下,它和H.264的NALU頭結構一致,可以把它認為是RTP h264負載類型字節,完全是多增加的一個字節,不影響后面的NALU結構

          +---------------+
          |0|1|2|3|4|5|6|7|
          +-+-+-+-+-+-+-+-+
          |F|NRI|  Type   |
          +---------------+

    這里的Type類型除1-23外還可取以下值:

      24    STAP-A   單一時間的組合包
      25    STAP-B   單一時間的組合包
      26    MTAP16   多個時間的組合包
      27    MTAP24   多個時間的組合包
      28    FU-A     分片的單元
      29    FU-B     分片的單元

    如果使用1-23就是:單一NAL單元模式

     

    封包介紹:

     

    單一NAL單元模式

      對于 NALU 的長度小于 MTU 大小的包, 一般采用單一 NAL 單元模式.
      對于一個原始的 H.264 NALU 單元常由 [Start Code] [NALU Header] [NALU Payload] 三部分組成, 其中 Start Code 用于標示這是一個

    NALU 單元的開始, 必須是 "00 00 00 01" 或 "00 00 01", NALU 頭僅一個字節, 其后都是 NALU 單元內容.
      打包時去除 "00 00 01" 或 "00 00 00 01" 的開始碼, 把其他數據封包的 RTP 包即可.

           0                   1                   2                   3
           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |F|NRI|  type   |                                               |
          +-+-+-+-+-+-+-+-+                                               |
          |                                                               |
          |               Bytes 2..n of a Single NAL unit                 |
          |                                                               |
          |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                               :...OPTIONAL RTP padding        |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    例:
      如有一個 H.264 的 NALU 是這樣的:

      [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

      這是一個序列參數集 NAL 單元. [00 00 00 01] 是四個字節的開始碼, 67 是 NALU 頭, 42 開始的數據是 NALU 內容.

      封裝成 RTP 包將如下:

      [ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]

      即只要去掉 4 個字節的開始碼就可以了.

     

     

    組合封包模式

      其次, 當 NALU 的長度特別小時, 可以把幾個 NALU 單元封在一個 RTP 包中.

           0                   1                   2                   3
           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                          RTP Header                           |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |STAP-A NAL HDR |         NALU 1 Size           | NALU 1 HDR    |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                         NALU 1 Data                           |
          :                                                               :
          +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |               | NALU 2 Size                   | NALU 2 HDR    |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                         NALU 2 Data                           |
          :                                                               :
          |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                               :...OPTIONAL RTP padding        |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    這里只介紹STAP-A模式,如果是STAP-B的話會多加入一個DON域,另外還有MTAP16、MTAP24,具體不介紹,可以看rfc文檔,文章尾貼一個鏈接可以去看。

    轉載的話注明一下作者:jwybobo2007 出處:http://blog.csdn.net/jwybobo2007/article/details/7054140

    例:

     

    如有一個 H.264 的 NALU 是這樣的:

      [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

      [00 00 00 01 68 42 B0 12 58 6A D4 FF ... ]

      封裝成 RTP 包將如下:

      [ RTP Header ] [78 (STAP-A頭,占用1個字節)] [第一個NALU長度 (占用兩個字節)] [ 67 42 A0 1E 23 56 0E 2F ] [第二個NALU長度 (占用兩個字節)] [68 42 B0 12 58 6A D4 FF ... ]

     

    分片的單元:

     

      當NALU的長度超過MTU時,就必須對NALU單元進行分片封包.也稱為Fragmentation Units(FUs).
      
           0                   1                   2                   3
           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          | FU indicator  |   FU header   |                               |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
          |                                                               |
          |                         FU payload                            |
          |                                                               |
          |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                               :...OPTIONAL RTP padding        |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

          Figure 14.  RTP payload format for FU-A

       The FU indicator octet has the following format:

          +---------------+
          |0|1|2|3|4|5|6|7|
          +-+-+-+-+-+-+-+-+
          |F|NRI|  Type   |
          +---------------+

       別被名字嚇到這個格式就是上面提到的RTP h264負載類型,Type為FU-A

       The FU header has the following format:

          +---------------+
          |0|1|2|3|4|5|6|7|
          +-+-+-+-+-+-+-+-+
          |S|E|R|  Type   |
          +---------------+

            S bit為1表示分片的NAL開始,當它為1時,E不能為1

       E bit為1表示結束,當它為1,S不能為1

       R bit保留位

       Type就是NALU頭中的Type,取1-23的那個值

     

    附:

    一個翻譯過的rfc3984文檔,翻譯的有點亂,湊貨的看看

    http://wenku.baidu.com/view/0f612e1ec5da50e2524d7f32.html

    轉 http://blog.csdn.net/jwybobo2007/article/details/7054140

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全