• rtp的封包与拆包h264


    请看文档rfc3984


    1.看h264的帧

    SPS序列參数帧

    00 00 00 01 67 64 。

    。。

    PPS图像參数帧

    00 00 00 01 68 EE。。。

    I帧

    00 00 00 01 65 EE。。

    。。

    P帧

    00 00 00 01 61 E0 。。。

    2. rtp头

    RTP 头格式例如以下:

    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             |
          |                             ....                              |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    V:版本号

    P:是否在尾部加pading

    X:是否加头扩展

    CC: CSRC列表个数

    M: 

          负载类型 Payload type(PT): 7bits
    rfc里面对一些早期的格式定义了这个payload type。可是后来的,如h264并没有分配。那就用96来取代。因此如今96以上都不表示特定的格式,详细表示什么要用sdp或者其它协议来协商。

          序列号 Sequence number(SN): 16bits
          时间戳 Timestamp: 32bits

    SSRC 域识别同步源,随机分配的。


    3. 分片和组合的rtp包中要用到的FU indicator  和  FU header 

       The FU indicator octet has the following format:

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

       别被名字吓到这个格式就是上面提到的RTP h264负载类型,Type为FU-A

    这里的Type类型除1-23外还可取下面值:

      24    STAP-A   单一时间的组合包
      25    STAP-B   单一时间的组合包
      26    MTAP16   多个时间的组合包
      27    MTAP24   多个时间的组合包
      28    FU-A     分片的单元
      29    FU-B     分片的单元

    假设使用1-23就是单一NAL单元模式。


       而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的那个值。

    4怎么封的包

    4.1 单包封包

    当一个h264的NAL能够也仅仅能放到一个包里,再加一个包就超过MTU时,採用单包封包。

     对于 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

          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                          RTP Header                           |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |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 个字节的開始码就能够了.

    4.2 组合包

    当几个H264的NAL,能够放到一个Rtp而且不超出MTU的长度。

           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文档,文章尾贴一个链接能够去看。

    处: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 ... ]


    4.3 分片

    当一个h264的NAL在一个rtp包中放不下。

    当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

          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                          RTP Header                           |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          | 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,此处的高三位就是H264的和type的高三位,此入的type是用来分别FU-A,FU-B..等的。

       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的那个值,也即是H264中的type值。因此FU indicator中的高三位与这里的type合在一起就是h264中ES流中的第五个字节。

    这个上面有讲到。rtp封包和拆包就是那么简单。









  • 相关阅读:
    完美的隐藏软键盘方法
    Android开发——构建自定义组件
    android 中 系统日期时间的获取
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
    总结:调用startActivityForResult,onActivityResult无响应的问题
    Android 頁面中有 EditText ,進入時取消自動彈出鍵盤
    Android中 Bitmap和Drawable相互转换的方法
    ImageView的属性android:scaleType
    动态添加组件(XML)
    Openfire3.8.2在eclipse中Debug方式启动最简单的方式
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5056235.html
Copyright © 2020-2023  润新知