负载类型为 MPEG-4 Elementary Stream 的 RTP 包的封包讲解

本文介绍MPEG4视频编码在RTP中的传输格式,包括MIME格式、RTP负载格式及其结构,详细解析AU Header、辅助信息区及接入单元数据区,并给出RTP分组封装规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 1.  说明

    本文的目的是描述MPEG4 Video ESRTP中的传输格式,本文的主要内容参考了RFC-3016RFC-3640,写作本文是为了帮助理解这两篇RFC的内容。如果描述有与这两篇RFC不一致的地方,应该以RFC为准。

     

    2.  MIME Format

    RFC-3016RFC-3640中,建议MPEG4 ES的信息描述遵循MIME的格式,关于MIME格式的详细信息,请参考RFC­-2045RFC-2046

     

    3.  RTP Payload Format

    (1)     Global Structure

    +---------+-----------+-----------+---------------+
             | RTP     | AU Header | Auxiliary | Access Unit   |
             | Header  | Section   | Section   | Data Section  |
             +---------+-----------+-----------+---------------+
     

      RTP Header 就是RTP协议所定义的RTP信息格式

      AU Header Section , Auxiliary Section , Access Unit Data Section 就是 RTP Payload

    MPEG4 Encoder输出的每个Packet ,被称为 Access Unit , 简写成 AU , AU Header就是描述 AU信息的标准格式。

    Auxiliary Section 是用来描述一些辅助信息的,在RFC中,这个结构没有被定义,可以由用户来自定义这块内容,也可以完全忽略。

    Access Unit Data Section 就是MPEG Encoder的输出内容

     

    (2)     RTP Header中与MPEG4 Payload相关的部分

    Payload Type (PT)  关于RTP Payload的类型应该定义MPEG4类型,这部分应该由RTP协议来定义,于本文无关。

     

    Marker Bit (M) 如果RTP Payload 是完整的1个或多个 AU ,M = 1 ; 如果RTP Payload AU的碎片( Fragment ,意指一个AU 被分割成多个 RTP PacketPayload ) ,只有最后一个碎片的 M = 1, 其他碎片的 M = 0

                 

    (3)     The AU Header Section

         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+
          |AU-h-length|AU-header|AU-header|      |AU-header|padding|
          |           |   (1)   |   (2)   |      |   (n)   | bits  |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+
    AU-h_length  就是 AU-Header_Length  , specifies the length in bits
       of the immediately following AU-headers, excluding the padding bits.
     
    AU Header  , 每个AU Header 是与 Access Unit( 或者是 AU Fragment) 相对应的。
    Padding Bits 是为了让 AU Header Section的长度(bits) 是 8的整数倍
     

    (4)     AU Header的格式

     
      +---------------------------------------+
          |     AU-size                           |
          +---------------------------------------+
          |     AU-Index / AU-Index-delta         |
          +---------------------------------------+
          |     CTS-flag                          |
          +---------------------------------------+
          |     CTS-delta                         |
          +---------------------------------------+
          |     DTS-flag                          |
          +---------------------------------------+
          |     DTS-delta                         |
          +---------------------------------------+
          |     RAP-flag                          |
          +---------------------------------------+
         |     Stream-state                      |
          +---------------------------------------+
       

    AU-Size : 就是指与AU Header 对应的那个 Access Unit 的长度 , in octets

    如果在RTP包中的PayloadAU Fragment AU-Size 也应该是完整的AU的长度,

    不应该是Fragment的长度,在接受段,可以看接受到的AU的长度是不是跟AU Header中定义的AU-Size一致,来判断这个AU是一个完整的单元还是只是碎片。并且可以通过这个字段来判断接受到Access Unit是不是完整。

     

    AU-Index : 就是 Access Unit 或者 AU Fragmentserial number。相邻的两个AUFragment),应该是AU-Index[n+1] = AU-Index[n] + 1

    如果一个RTP Packet 中包含多个Access Unit , 那第一个AU Header必须有AU-Index字段,接下来的几个AU-Header则不允许有AU-Index字段,而是用AU-Index-Delta字段来取代。

     

    AU-Index-Delta AU-Index-Delta是根据上一个AU-Index的值来计算当前的AU-Index。计算公式为 AU-Index[n+1] = AU-Index[n] + AU-Index-Delta + 1 , 所以通常情况下 , AU-Index-Delta应该是零,如果AU-Index-Delta的值不是零,则说明在RTP Packet封装的时候使用了Interleave模式,关于Interleave模式,我们以后再来解释。

     

    CTS-Flag 1 表示接下来的数据是CTS 0 表示没有CTS

    CTS : the composition time stamp 。
    DTS-Flag : 1 表示接下来的数据是DTS , 0 表示没有DTS
    DTS:  the decoding time stamp
     
    RAP-Flag:  1 表示对应的 Access Unit 是一个 Random Access Unit , 也就是所谓的 key-packet 。 
    如果 对应的是 Access Unit Fragment , 那么只有第一个Fragment的RAP-Flag的值是1, 其他Fragment的值应该是 0。
     
    Stream-state :  表示编码器状态。如果编码器状态改变,这个值+1。
    RFC中没有明确说明这个状态指那些内容, 我估计应该是resolution , fps, bps 等参数的改变吧 。
       

    (5)      The Auxiliary Section

           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+
          | auxiliary-data-size   | auxiliary-data       |padding bits |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+
     

    这部分内容没有定义,如果有用户数据,可以考虑把用户数据放入Auxiliary Section

     

    (6)      Access Unit 

       

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+
      | AU(1)  | AU(2)  | AU(3) | … | AU(n)
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+
     

         所以Access Unit 就是 MPEG4 编码器的输出了。

     

    4.  关于RTP Packet的封装

    RTP Payload允许装载1个或多个完整的Access Unit

    也允许装载1Access Unit Fragment

    禁止把完整的Access Unit Access Unit Fragment 封装在同一个RTP Packet中。禁止把多个Access Unit Fragment 封装在RTP Packet 中。

    通常来说 , RTP Packet的顺序应该跟Access Unit的顺序一致,除非是Interleave模式下。关于 Interleave模式请参看相关的RFC , 这里就不多做阐述了。

      

            Reference

    [1] RFC-3016

    [2] RFC-3640

    [3] ISO/IEC 14496 Part 2

    [4] RFC-2045

    [5] RFC-2046

    [6] RFC-1889

    [7] RFC-3550

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值