rtmp协议是adobe公司发明的直播流协议,是目前主流的视频上传协议。
Type1的trunk 和上一个trunk 拥有相同的message stream id。且Timestamp delta 表示相对上一个trunk 的时间差,实战中大多数音视频数据都采用相对时间戳。
Type 2 的trunk 和上一个trunk 拥有相同的长度、消息类型、消息流id。
Type 3 的trunk msg header 长度为0,表示和上一个trunk 所有参数都相同。如果type3跟在type0 后面,则type3 的相对时间戳也是0。
注:通常情况下一个type3不会独立存在,而是跟在type0或type1后面。一个数据包(多帧)通常比一个chunk包大,所以要由多个chunk存放一个数据包,这时第一个chunk通常是type0或type1,后面跟着的chunk是type3。由于chunk中的message length指的是数据长度,所以解析完第一个chunk,数据还没有完毕,还需要继续解析后面type3的chunk,这时type3的头信息直接使用前面的type0或type1即可。有一点需要注意,后面type3的chunk长度实际上是剩余长度,而不是和前面的chunk长度相同。
用来通知正在等待接收指定的Chunk Stream 的对端,放弃等待,并且放弃处理AboutMessage 中所指明的chunk stream id 的Chunk Stream 中的消息。注意这条命令只是撤销一个Chunk Stream 的数据,并不是整条Message Stream。实战中这个消息基本不会发送, 在rtmpdump 中也不会处理这个消息。
用来告知server,到目前为止已经收到了一定量的数据。0x05 消息指定了server 发送的窗口最大值,如果在发送的数据达到了最大值还没有收到客户端发来的报告,则server 会停止发送数据,经过实测fms 超过三倍这个窗口时会停止发送数据。因此客户端必须在收到数据未达到最大值前报告自己接收到的字节数。Sequence num 表示到目前为止客户端收到的字节数,但是要注意这个值会溢出,溢出后server不久便会停止发送数据,rtmpdump 就有这个问题。
这条消息是用户控制消息。主要是用来在Client 与Server 之间发送消息通知对方用户控制事件。这个消息的前2 个bytes 是指事件的类型,后面是事件的数据。根据Event Type 的不同,Event Data 的长度是不同的。
- Type0,Stream Begin,服务器端通知客户端message stream 已经可以正常工作了。Event Data 是0,长度为4 个字节。这个事件是当服务器收到客户端的connect 命令后发送给客户端的。
- Type1,Stream EOF,服务器端通知客户端播放已经结束了。Event Data 表示流ID,长度为4 个字节。
- Type2,Stream Dry,服务器端通知客户端message stream 已经没有数据了。EventData 表示流ID,长度为4 个字节。服务器端在一段时间内没有检测到消息则可以给客户端发送这个事件。
- Type3,SetBuffer Length,客户端通知服务器端用来接收数据的buffer 大小(以毫秒为单位)。Event Data 共8 比特,前4 比特表示流ID,后4 比特代表buffer 大小。客户端在服务器端处理流之前发送这个事件。
- Type4,StreamIsRecorded,服务器端通知客户端这个流需要被录像。Event Data 表示流ID,长度为4 个字节。
- Type6,PingRequest,服务器端用于测试客户端是否存活。Event Data 为服务器时间戳,长度为4 个字节。
- Type7,PingResponse,客户端反馈服务器端PingRequest 消息,Event Data 为ping消息中的时间戳,长度为4 个字节。Ping 消息必须回,否则一段时间后server 会停止服务。
这条消息也叫“Server Bandwidth”,主要是用于告知对方自己希望对方接收多少个字节之后回应一个Ack 确认消息。这个具体的字节数也叫做窗口大小。通常Server 会在成功处理Client 发出的connect 请求后发送这个Msg 更新Client 的Ack 窗口大小
这条消息也叫“Client Bandwidth”,和Msg Type 0x05 相对应,这条消息是告诉对方要以怎样的带宽发送数据,带宽值应该与对方的Windows Size 相同。如果收到这条消息的一方发现自己的Windows Size 和这条消息中指定的Bandwidth 不同,应该回应一个Msg Type0x05。另外这条消息还有一个额外的字段Limit type,它的取值分别为:hard(0)、soft(1)、dynamic(2)。Hard:对方的发送数据带宽必须严格符合指定带宽。
Soft,对方发送数据带宽可以自行决定。必要时接收方可以限制对方带宽。Dynamic,带宽既可以是hard 也可以是soft。