您的位置:首页 > 编程语言 > PHP开发

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

2013-10-07 17:47 323 查看
1.说明

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

2.MIMEFormat

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

3.RTPPayloadFormat

(1)GlobalStructure

+---------+-----------+-----------+---------------+

|RTP|AUHeader|Auxiliary|AccessUnit|

|Header|Section|Section|DataSection|

+---------+-----------+-----------+---------------+


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

AUHeaderSection,AuxiliarySection,AccessUnitDataSection
就是RTP的Payload

从MPEG4Encoder输出的每个Packet
,被称为AccessUnit,简写成AU,AUHeader就是描述AU信息的标准格式。

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

AccessUnitDataSection就是MPEGEncoder的输出内容

(2)RTPHeader中与MPEG4Payload相关的部分

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

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


(3)TheAUHeaderSection

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-..-+-+-+-+-+-+-+-+-+-+

|AU-h-length|AU-header|AU-header||AU-header|padding|

||(1)|(2)||(n)|bits|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-..-+-+-+-+-+-+-+-+-+-+

AU-h_length就是AU-Header_Length,specifiesthelengthinbits

oftheimmediatelyfollowingAU-headers,excludingthepaddingbits.


AUHeader,每个AUHeader是与AccessUnit(或者是AUFragment)相对应的。

PaddingBits是为了让AUHeaderSection的长度(bits)是8的整数倍


(4)AUHeader的格式

+---------------------------------------+

|AU-size|

+---------------------------------------+

|AU-Index/AU-Index-delta|

+---------------------------------------+

|CTS-flag|

+---------------------------------------+

|CTS-delta|

+---------------------------------------+

|DTS-flag|

+---------------------------------------+

|DTS-delta|

+---------------------------------------+

|RAP-flag|

+---------------------------------------+

|Stream-state|

+---------------------------------------+


AU-Size:就是指与AUHeader
对应的那个AccessUnit的长度,inoctets


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

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

AU-Index:就是AccessUnit
或者AUFragment的serialnumber。相邻的两个AU(Fragment),应该是AU-Index[n+1]
=AU-Index
+1。

如果一个RTPPacket中包含多个AccessUnit,
那第一个AUHeader必须有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
+AU-Index-Delta+1,所以通常情况下,AU-Index-Delta应该是零,如果AU-Index-Delta的值不是零,则说明在RTP
Packet封装的时候使用了Interleave模式,关于Interleave模式,我们以后再来解释。

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

CTS:thecompositiontimestamp。

DTS-Flag:1表示接下来的数据是DTS,0表示没有DTS

DTS:thedecodingtimestamp


RAP-Flag:1表示对应的AccessUnit是一个RandomAccessUnit,也就是所谓的key-packet。

如果对应的是AccessUnitFragment,那么只有第一个Fragment的RAP-Flag的值是1,其他Fragment的值应该是0。


Stream-state:表示编码器状态。如果编码器状态改变,这个值+1。

RFC中没有明确说明这个状态指那些内容,我估计应该是resolution,fps,bps等参数的改变吧。


(5)TheAuxiliarySection

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-..-+-+-+-+-+-+-+-+-+

|auxiliary-data-size|auxiliary-data|paddingbits|

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-..-+-+-+-+-+-+-+-+-+


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

(6)AccessUnit

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-..-+-+-+-+-+-+-+-+-+

|AU(1)|AU(2)|AU(3)|…|AU(n)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-..-+-+-+-+-+-+-+-+-+


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

4.关于RTPPacket的封装

RTPPayload允许装载1个或多个完整的AccessUnit

也允许装载1个AccessUnitFragment

禁止把完整的AccessUnit和AccessUnitFragment
封装在同一个RTPPacket中。禁止把多个AccessUnitFragment
封装在RTPPacket中。

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

Reference
[1]RFC-3016

[2]RFC-3640

[3]ISO/IEC14496Part2

[4]RFC-2045

[5]RFC-2046

[6]RFC-1889

[7]RFC-3550
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: