首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

转载:RTMP协议封包 参照Red5

2012-09-10 
转载:RTMP协议封包 参考Red5RTMP协议封包 参考Red5RTMP协议封包 由一个包头和一个包体组成,包头可以是4种

转载:RTMP协议封包 参考Red5

RTMP协议封包 参考Red5
RTMP协议封包 由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4,? 1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息,?8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推?。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节.
完整的12字节RTMP包头每个字节的含义:
用途大小(Byte)含义Head_Type1包头TiMMER3时间戳AMFSize3数据大小AMFType1数据类型StreamID4流ID
一、Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0进行"与"计算:?
Head_Type的前两个Bit和长度对应关系:
BitsHeader Length0012 bytes018 bytes104 bytes111 byte
Head_Type的后面6个Bit和StreamID决定了ChannelID。??StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1?参考red5
ChannelIDUse02Ping 和ByteRead通道03Invoke通道 我们的connect() publish()和自字写的NetConnection.Call()?数据都是在这个通道的04Audio和Vidio通道05 06 07服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据
例如在rtmp包里面经常看到的0xC2, 就表示一字节的包头,channel=2.

二、TiMMER

TiMMER占3个字节纪录的是时间戳,音视频流的时间戳是统一排的。可分为绝对时间戳和相对时间戳。
fms对于同一个流,发布的时间戳接受的时间戳是有区别的
publish时间戳,采用相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个媒体包的绝对时间戳之间的差距,也就是说音视频时间戳在一个时间轴上面.单位毫秒。
play时间戳,相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个同类型媒体包的绝对时间戳之间的差距, 也就是说音视频时间戳分别为单独的时间轴,单位毫秒。
flv格式文件时间戳,绝对时间戳,时间戳长度3个字节。超过0xFFFFFF后时间戳值等于TimeStamp & 0xFFFFFF。
flv格式文件影片总时间长度保存在onMetaData的duration属性里面,长度为8个字节,是一个翻转的double类型。

三、AMFSize
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。如果超过了128字节,那么由多个后续RTMP封包组合,每个后续RTMP封包的头只占一个字节。一般就是以0xC?开头。

四、AMFType
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。
AMFType是包的类型

0×01Chunk Sizechanges the chunk size for packets0×02Unknown?0×03Bytes Readsend every x bytes read by both sides0×04Pingping is a stream control message, has subtypes0×05Server BWthe servers downstream bw0×06Client BWthe clients upstream bw0×07Unknown?0×08Audio Datapacket containing audio0×09Video Datapacket containing video data0x0A-0x0EUnknown?0x0FFLEX_STREAM_SENDTYPE_FLEX_STREAM_SEND0x10FLEX_SHARED_OBJECTTYPE_FLEX_SHARED_OBJECT0x11FLEX_MESSAGE?TYPE_FLEX_MESSAGE?0×12Notifyan invoke which does not expect a reply0×13Shared Objecthas subtypes0×14Invokelike remoting call, used for stream actions too.0×16StreamData这是FMS3出来后新增的数据类型,这种类型数据中包含AudioData和VideoData

五、StreamID
StreamID是音视频流的ID,如果AMFType!=0x08 或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1?参考red5
例如当ChannelID为2、3、4时StreamID都为1 当ChannelID为9的时候StreamID为2

六、封包分析
例如有一个RTMP封包的数据03?00 00 00?00 01 02?14?00 00 00 00?02?00 07?63 6F 6E 6E 65 63 74?00?3F F0 00 00 00 00 00 00?08?,,,
数据依次解析的含义?
03表示12字节头,channelid=3
000000表示Timmer=0
000102表示AMFSize=18
14表示AMFType=Invoke 方法调用
?00 00 00 00 表示StreamID = 0
//到此,12字节RTMP头结束下面的是AMF数据分析,具体的AMF0数据格式请参考?http://www.cnweblog.com/fly2700/archive/2008/04/09/281432.html
02表示String
0007表示String长度7
63 6F 6E 6E 65 63 74 是String的Ascall值"connect"
00表示Double
3F F0 00 00 00 00 00 00 表示double的0.0
08表示Map数据开始

热点排行