1 握手
adobe修改了握手部分的协议,但是没有公开。根据rtmp specification 1.0里面的握手过程,flash player是播不了h264编码的视频。修正后的握手协议可以参照:http://blog.csdn.net/winlinvip/article/details/7714493
2 rtmp 包格式
rtmp 使用块(chunk)的概念来发送数据,默认的块大小是128(不包括头部数据大小),如果要发送的数据超过了设定的块大小,就要分为多块进行发送。rtmp chunk的总体格式如下所示,rtmp chunk头部信息包括三部分:基本头,消息头,扩展时间戳。
+----------------+--------------------+-------------------------+----------------+| Basic Header | Message Header | Extended Timestamp | Chunk Data |+----------------+--------------------+-------------------------+----------------+| ||<------------------- Chunk Header ------------------------->|
2.1 rtmp chunk basic header
rtmp 块的基本头包手两个信息:块格式(chunk format) 和 块流ID(chuck stream id)
0 1 2 3 4 5 6 7+-+-+-+-+-+-+-+-+| fmt | cs id |+-+-+-+-+-+-+-+-+
fmt: rtmp块头的格式,有4种类型
cs_id:
cs_id 块流ID 基本头的长度(字节) >=2 cs_id 1 0 【第二字节的值】 + 64 2 1 【第三字节的值】*256+【第二字节的值】+64 3
2.2 rtmp message header
rtmp 消息头一般包括:时间戳(3Bytes),消息长度(3Bytes),消息类型(1Byte),消息流Id(4Bytes)。
但是并不总是会包含这些信息。但是可以根据块基本头的fmt,来判断消息头中包含了哪些信息(如表格所示)。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| timestamp | message length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| message length (cont) | message type id | msg stream id |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| message stream id (cont) |