原创 RTMP协议 封包 参考Red5 RTMP协议封包 由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4, 1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,Head_Type,AMFSize,AMFType,StreamID信 息, 8字节的包头只纪录了时间戳,Head_Type,AMFSize,AMFType, 4个字节的包头记录了时间戳,Head_Type。1个字节的包头只记录了Head_Type 。包体最大长度默认为128字节,通过chunkSize 可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节. 完整的RTMP包头有12字节,由下面5个部分组成:
一、Head_Type - 包头类型 Head_Type占用RTMP包的第一个字节,这个字节里面记录了包的类型和包的ChannelID。Head_Type字节的前两个Bit决定了包头的长度.它可以用掩码0xC0进行"与"计算: Head_Type的前两个Bit和长度对应关系:
Head_Type的后面6个Bit和StreamID决定了ChannelID。 StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5
例如在rtmp包的数据中里面,发现被插入了一个0xC2,这个就是一字节的包头,并且channelID=2. 二、TiMMER - 时间戳 时
间戳占用RTMP包头的第2、3、4
三个字节。RTMP时间戳可分为绝对时间戳和相对时间戳,纪录的是音视频的时间信息。相对时间戳指的是二个RTMP包之间的时间间隔,单位毫秒。而绝对时
间戳指的是当前封包发送的时刻,单位也是毫秒。对于音视频的播放,时间戳非常关键,因为音视频的播放同步是由时间戳来控制的,如果你的视频出现卡顿,音视
频不同步,延时越来越大,很可能就是你的时间戳不准导致的。
五、StreamID - 流ID 占 用RTMP包头的最后4个字节,是一个big-endian的int型数据。我们x86 计算机内存中数据存放都是小尾数模式:little-endian,而网络数据流一般都是大尾数模式:big-endian。 StreamID是音视频 流的唯一ID, 一路流如果既有音频包又有视频包,那么这路流音频包的StreamID和他视频包的StreamID相同,但ChannelID不同。 ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1 参考red5。如果这个封包既不是音频包,也不是视频包,那么他的StreamID=0. 例如当音视频包ChannelID为2、3、4时StreamID都为1 当音视频包ChannelID为9的时候StreamID为2 六、封包分析 例如有一个RTMP封包的数据0300 00 00 00 01 02 1400 00 00 00 0200 07 63 6F 6E 6E 65 63 74 003F F0 00 00 00 00 00 00 08 ,,, 数据依次解析的含义 03表示12字节头,channelid=3 000000表示时间戳 Timer=0 000102表示AMFSize=18 14表示AMFType=Invoke 方法调用 00 00 00 00 表示StreamID = 0 //到此,12字节RTMP头结束下面的是AMF数据分析,具体的AMF0数据格式请参考 RTMP协议 二、AMF数据 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数据开始 下面是我用c++实现的完整的rtmp客户端程序下载 RTMP协议分析 二、AMF数据:http://www./fly2700/archive/2008/04/09/281432.html 程序下载:http://www./fly2700/archive/2008/04/02/280641.html |
|