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字节的时间戳。

results matching ""

    No results matching ""