此文档是想到哪写到哪:参考文档:
一些控制协议消息(消息类型ID可以在下列文档中查找)
https://blog.csdn.net/lipengshiwo/article/details/53267674
源码文件参考:
https://blog.csdn.net/leixiaohua1020/article/details/42105049
客户端和服务器交互文档:
https://www.cnblogs.com/zjoch/archive/2013/08/28/3286301.html
在传输的过程中以流为单位,但流又细分为块,所以传输基本的大小是块。(程序中设置也为块):
为什么设置为块(一般为128(可以动态设置,在RTMP_Init函数中)128位默认数据块的长度,只是数据的长度):块太大会早成视频帧阻塞,造成卡顿,块太小会传输太多的块头,减小了消息的传输。(128字节~65536字节)
这里分为(message)消息头和块头(消息分为多个块),第一个数据包的消息头必须是12bytes,告诉对方这个流的信息。
1:消息头:时间戳(4字节),长度(3字节),消息类型ID(1字节),消息流ID(消息的唯一标识)
rtmp协议包头+数据(包头长度为12,8,4,1)包头包含了head type,时间戳,amf数据类型,数据大小,流ID。根据不同的message头填充不同的参数
RTMP在首发数据的时候是把message分为chunk发送,而且必须在发送完一个chunk在重新发送下一个chunk,chunk中的messageID代表那个message,接收端将这个ID来的chunk组装成message(为了防止数据量过大,占用硬件资源)
1块格式:rtmp传输的基本格式:(块格式)(块头+数据)(该格式很重要)
块头=基本头+消息头+扩展时间戳+块数据
块流ID+块类型
a:基本头(1-3字节):块流ID和块类型
(在这还要知道块头类型(块类型值为0.1.2.3),然后设置块流ID(简称CSID))(用来表示一个特定的流通道)
1字节:2~63的块流ID 2字节64~319的块流ID 3字节64~65599字节的块流ID。
b:块消息头(0.3.7.11字节):被发送的消息,由块头类型决定(基本头中的块头类型参数)
根据类型字段来确定消息头的大小1:类型0:11字节
时间戳(3字节)+消息长度(3)+消息类型ID(1)+消息流ID(4)
类型为0的块,此字段必须为绝对时间戳。如果时间戳大于等于16777215(0xFFFFFF),此字段的取值必须为16777215,并且与扩展时间戳一起组成32比特的完整时间戳。如果时间戳小于16777215,那么此字段代表了完整的时间戳
消息长度:,实际发送的数据。块的总长度::::注意(不是块本身的长度)
消息类型ID:发送数据的种类:音频(是8),视频(是9)等参数,
消息流ID:该块所在的流的ID值。根据该ID将块组装成消息。
其他类型省略:
c:扩展时间戳:取决于消息头中编码的时间戳。
chunk中会有时间戳timestamp和时间戳差timestamp delta,并且它们不会同时存在,只有这两者之一大于3个字节能表示的最大数值0xFFFFFF=16777215时,才会用这个字段来表示真正的时间戳,否则这个字段为0。扩展时间戳占4个字节,能表示的最大数值就是0xFFFFFFFF=4294967295。当扩展时间戳启用时,timestamp字段或者timestamp delta要全置为1,表示应该去扩展时间戳字段来提取真正的时间戳或者时间戳差。注意扩展时间戳存储的是完整值,而不是减去时间戳或者时间戳差的值
d:块数据:当前块的有效数据。
二:协议控制消息
RTMP的块流使用消息类型ID1,2,3,4,5,6作为控制消息,这些消息包含了必要的RTMP快流协议信息。这些协议控制消息使用0作为消息流ID,使用2作为块流ID,
设置块大小(Message ID=1),分割message(Message ID=2),Ackonwledgement(ID=3),窗口响应大小(ID=5),设置带宽大小(ID=6),不同类型的命令有不同类型的ID。音频(ID=8),视频ID=9,
命令消息(ID=17或者20) (客户端或者服务器通过发送此消息来通知对方用户控制事件,)
连接消息:connect客户端向服务器发送连接请求