为了方便查阅,把RTMP协议的包头记录下来,以便参考:
RTMP协议在握手完成以后,服务器与客户端通过包(chunk)来进行信令交换。
包(thunk)格式如下
每个包有包头与数据组成。而包头自身是由三部分组成:
包头可以是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_Type 1 包头
TiMMER 3 时间戳
AMFSize 3 数据大小
AMFType 1 数据类型
StreamID 4 流ID
一、Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0进行"与"计算:
Head_Type的前两个Bit和长度对应关系:
Bits Header Length
00 12 bytes
01 8 bytes
10 4 bytes
11 1 byte
Head_Type的后面6个Bit和StreamID决定了ChannelID。
StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5
ChannelID 用途
02 Ping 和ByteRead通道
03 Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的
04 Audio和Vidio通道
05 06 07 服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据
例如:在rtmp包里面经常看到的0xC2, 就表示一字节的包头,channelID=2.。
来源:oschina
链接:https://my.oschina.net/u/4260256/blog/4302782