全部博文(584)
分类: LINUX
2010-05-18 11:10:50
1. 说明
本文的目的是描述MPEG4 Video ES在RTP中 的传输格式,本文的主要内容参考了RFC-3016和RFC-3640,写作本文是为了帮助理解这两篇RFC的内容。如果描述有与这两篇RFC不 一致的地方,应该以RFC为准。
2. MIME Format
在RFC-3016和RFC-3640中,建议MPEG4 ES的信息描述遵循MIME的格式,关于MIME格 式的详细信息,请参考RFC-2045和RFC-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 Packet的Payload ) , 只有最后一个 碎片的 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包中的Payload是AU Fragment, AU-Size 也应该是完整的AU的 长度,
不应该是Fragment的长度,在接受段, 可以看接受到的AU的 长度是不是跟AU Header中定义的AU-Size一致, 来判断这个AU是一个完整的单元 还是只是碎片。并且可以通过这个字段来判断接受到Access Unit是不是完整。
AU-Index : 就是 Access Unit 或者 AU Fragment的serial number。相邻的两个AU(Fragment) , 应该是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
也允许装载1个Access 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