7.1 消息类型
客户端和服务端通过在网络上发送消息来实现交互,消息可以是任意类型,包括但不限于音频消息、视频消息、指令消息、共享对象消息、数据消息和用户控制消息。
7.1.1 指令消息(20,17)
指令消息在客户端和服务端之间传递AMF编码的指令,消息类型20代表AMF0编码,消息类型17代表AMF3编码。发送这些消息来完成连接、创建流、发布、播放、暂停等操作。像状态、结果这样的指令消息,用于通知发送方请求的指令状态。一条指令消息由指令名、事务ID和包含相关参数的指令对象。客户端或服务端还可以通过指令消息来实现远程过程调用(RPC)。
7.1.2 数据消息(18,15)
客户端或服务端通过该消息来发送元数据或其他用户数据。元数据包括数据(音频、视频)的创建时间、时长、主题等详细信息。消息类型18代表AMF0编码,消息类型15代表AMF3编码。
7.1.3 共享对象消息(19,16)
共享对象是一个在多个客户端、示例之间进行同步的Flash对象(键值对集合)。消息类型19代表AMF0编码,消息类型16代表AMF3编码。每个消息都可以包含多个事件。
支持以下事件类型:
名称 | 取值 | 描述 |
---|---|---|
创建 | 1 | 客户端向服务端发送,请求创建指定名称的共享对象 |
释放 | 2 | 客户端通知服务端,共享对象已在本地删除 |
请求更新 | 3 | 客户端请求修改共享对象的属性值 |
更新 | 4 | 服务端向除请求发送方外的其他客户端发送,通知其有属性的值发生了变化。 |
成功 | 5 | “请求更新”事件被接受后,服务端向发送请求的客户端回复此事件 |
发送消息 | 6 | 客户端向服务端发送此事件,来广播一个消息。服务端收到此事件后向所有客户端广播一条消息,包括请求方客户端 |
状态 | 7 | 服务端发送此事件来通知客户端错误信息 |
清除 | 8 | 服务端向客户端发送此事件,通知客户端清除一个共享对象。服务端在回复客户端的“创建”事件时也会发送此事件 |
移除 | 9 | 服务端发送此事件,使客户端删除一个插槽 |
请求移除 | 10 | 客户端删除一个插槽时发送此事件 |
创建成功 | 11 | 当连接成功时服务端向客户端发送此事件 |
7.1.4 音频消息(8)
客户端或服务端通过发送此消息来发送音频数据给对方,消息类型8是为音频消息预留的。
7.1.5 视频消息(9)
客户端或服务端通过发送此消息来发送视频数据给对方,消息类型9是为视频消息预留的。
7.1.6 组合消息(22)
组合消息,是一个消息包含多个子RTMP消息,子消息符合6.1章节所描述的消息格式。消息类型22用于组合消息。
组合消息的消息流ID会覆盖其中子消息的消息流ID。
组合消息的时间戳和其中第一个子消息的时间戳的差值,是用来将所有子消息的时间戳重整为流时间标尺的位移量。位移量会加到每一个子消息的时间戳上来换算出正常的流时间。第一个子消息的时间戳应该与组合消息的时间戳相同,所以位移量应该为0。
Back Pointer(反向指针)包含前一个消息的长度(包括消息头),这样就能符合flv文件格式,并用于进行后退操作。
使用组合消息有以下好处:
- 块流协议中,一个块最多只能发送一个消息,这样就使用组合消息,加大块大小,从而降低发送的块数量。
- 子消息在内存中连续存放,这样系统调用网络发送数据的性能更高。
7.1.7 用户控制消息事件
客户端或服务器通过该消息发送用户控制事件,用户控制消息格式请参考6.2章节。
用户控制消息格式
用户控制消息支持以下事件:
名称 | 取值 | 描述 |
---|---|---|
流开始 | 0 | 服务端发送该事件,用来通知客户端一个流已经可以用来通讯了。默认情况下,该事件是在收到客户端连接指令并成功处理后发送的第一个事件。事件的数据使用4个字节来表示可用的流的ID |
流结束 | 1 | 服务端发送该事件,用来通知客户端其在流中请求的回放数据已经结束了。如果没有额外的指令,将不会再发送任何数据,而客户端会丢弃之后从该流接收到的消息。事件数据使用4个字节来表示回放完成的流的ID。 |
流枯竭 | 2 | 服务端发送该事件,用来通知客户端流中已经没有更多的数据了。如果服务端在一定时间后没有探测到更多数据,它就可以通知所有订阅该流的客户端,流已经枯竭。事件数据用4个字节来表示枯竭的流的ID。 |
设置缓冲区大小 | 3 | 客户端发送该事件,用来告知服务端用来缓存流中数据的缓冲区大小(单位毫秒)。该事件在服务端开始处理流数据之前发送。事件数据中,前4个字节用来表示流ID,之后的4个字节用来表示缓冲区大小(单位毫秒)。 |
流已录制 | 4 | 服务端发送该事件,用来通知客户端指定流是一个录制流。事件数据用4个字节表示录制流的ID |
ping请求 | 6 | 服务端发送该事件,用来探测客户端是否处于可达状态。事件数据是一个4字节的时间戳,表示服务端分发该事件时的服务器本地时间。客户端收到后用ping响应 回复服务端。 |
ping响应 | 7 | 客户端用该事件回复服务端的ping请求 ,事件数据为收到的ping请求 中携带的4字节的时间戳。 |