Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682969
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: LINUX

2010-05-18 11:10:50

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 , 那么只有第一个FragmentRAP-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

阅读(2182) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~