消息Message分类
RTMP消息Message的格式如下:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type | Payload length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
每一个Message都会有一个消息类型Message Type。通过该type接收方可以判断接收到的数据的类型,从而做相应的处理。
Message Type在1-7的消息用于协议控制,协议控制消息是用来与对端协调控制的,用户一般情况下无需操作其中的数据。Message Type ID为8,9的消息分别用于传输音频和视频数据。Message Type ID为15-20的消息用于发送AMF编码的命令,负责用户与服务器之间的交互,比如播放,暂停等。
协议控制消息
- 协议控制协议,是RTMP用来在端对端进行协议协调控制的;
- Message Type类型范围是1 ~ 7;
- 1~2 用于chunk协议;
- 3~6 用于rtmp协议本身;
- 协议控制消息必须要求Message Stream ID=0 和 Chunk Stream ID=2
Message Type = 1,Set Chunk Size
设置块的大小,通知对端使用新的块大小,4字节。默认的chunk size为128字节。
+-------------+----------------+-------------------+----------------+
| Basic header|Chunk Msg Header|Extended Timestamp | Set chunk size |
+-------------+----------------+-------------------+----------------+
Message Type = 2,Abort Message
Abort Message 取消消息,用于通知正在等待接收块以完成消息的对等端,丢弃一个块流中已经接收的部分并且取消对该消息的处理,共4 bytes。
+-------------+----------------+-------------------+----------------+
| Basic header|Chunk Msg Header|Extended Timestamp | Chunk Stream ID|
+-------------+----------------+-------------------+----------------+
Message Type = 3,Acknowledgement Message
- Acknowledgement 确认消息,客户端或服务端在接收到数量与窗口大小相等的字节后发送确认消息到对方。窗口大小是在没有接收到接收者发送的确认消息之前发送的字节数的最大值。
- 服务端在建立连接之后发送窗口大小。
- 本消息指定序列号。序列号,是到当前时间为止已经接收到的字节数。
- Acknowledgement Message共4 bytes。
+-------------+----------------+-------------------+----------------+
| Basic header|Chunk Msg Header|Extended Timestamp | Sequence Number|
+-------------+----------------+-------------------+----------------+
Message Type = 4,User Control Message
- 用户控制消息,客户端或服务端发送本消息通知对方用户的控制事件。
- 本消息承载事件类型和事件数据。消息数据的头两个字节用于标识事件类型。
- 事件类型之后是事件数据。事件数据字段是可变长的。
+-------------+----------------+-------------------+-----------+-----------+
| Basic header|Chunk Msg Header|Extended Timestamp | Event Type|Event Data |
+-------------+----------------+-------------------+-----------+-----------+
- Event Type:2字节,事件类型;
- Event Data:可变长度,表示事件相应的数据。
Message Type = 5,Window Acknowledgement Size
确认窗口大小,客户端或服务端发送本消息来通知对方发送确认消息的窗口大小,共4 bytes。
+-------------+----------------+-------------------+----------------------------+
| Basic header|Chunk Msg Header|Extended Timestamp | Window Acknowledgement Size|
+-------------+----------------+-------------------+----------------------------+
Message Type = 6,Set Peer Bandwidth
- 设置对等端带宽,客户端或服务端发送本消息更新对等端的输出带宽。
- 发送者可以在限制类型字段(1 bytes)把消息标记为硬(0),软(1),或者动态(2)。
- 如果是硬限制对等端必须按提供的带宽发送数据。如果是软限制,对等端可以灵活决定带宽,发送端可以限制带宽?。如果是动态限制,带宽既可以是硬限制也可以是软限制。
+-------------+----------------+-------------------+----------------------------+------------+
| Basic header|Chunk Msg Header|Extended Timestamp | Window Acknowledgement Size| Limit type |
+-------------+----------------+-------------------+----------------------------+------------+
Hard(Limit Type=0):接受端应该将Window Ack Size设置为消息中的值
Soft(Limit Type=1):接受端可以讲Window Ack Size设为消息中的值,也可以保存原来的值(前提是原来的Size小与该控制消息中的Window Ack Size)
Dynamic(Limit Type=2):如果上次的Set Peer Bandwidth消息中的Limit Type为0,本次也按Hard处理,否则忽略本消息,不去设置Window Ack Size。
音视频数据
Message Type = 8,Audio message
音频数据,客户端或服务端发送本消息用于发送音频数据。消息类型 8 ,保留为音频消息。
Message Type = 9,Video message
视频数据,客户端或服务端使用本消息向对方发送视频数据。消息类型值 9 ,保留为视频消息。
元数据消息
Message Type = 15 or 18,Data message
客户端或服务端通过本消息向对方发送元数据和用户数据。元数据包括数据的创建时间、时长、主题等细节。消息类型为 18 的用 AMF0 编码,消息类型为 15 的用AMF3 编码。
共享对象消息
Message Type = 16 or 19,Shared object message
共享对象是跨多个客户端,实例同步的 FLASH 对象(名值对的集合)。
命令消息
Message Type = 17 or 20,Command message
命令消息都是用AMF编码的,AMF有两种,为AMF0和AMF3。命令消息有命令名,传输ID,和命名对象组成。而命名对象是由一系列参数组成的。
Command message type
- NetConnection:代表服务端和客户端之间连接的更高层的对象,包含4个命令类型:
- connect:该命令是client先发送给server,意思是我要连接,能建立连接吗?server返回含“_result”或者“_error”命令名。返回“_result”,表示server能提供服务,client可以进行下一步。“_error”,很明显server端不能提供服务。
- call:NetConnection 对象的调用方法在接收端运行远程过程调用。远程方法的名作为调用命令的参数。
- close:close connection;
- createStream:客户端发送本命令到服务端创建一个消息通讯的逻辑通道。音频,视频和元数据的发布是由创建流命令建立的流通道承载的。NetConnection 本身是默认的流通道,具有流ID 0。协议和一少部分命令消息,包括创建流,就使用默认的通讯通道。
- NetStream:代表发送音频流,视频流和其他相关数据的通道的对象。我们也发送像播放,暂停等控制数据流动的命令。
- play
+-------------+ +----------+
| Play Client | | | Server |
+-------------+ | +----------+
| |Handshaking and Application| |
| | connect done | |
| | |
---+---- |---------Command Message(createStream) --------->|
Create | |
Stream | |
---+---- |<-------------- Command Message -----------------|
| (_result- createStream response) |
| |
---+---- |------------ Command Message (play) ------------>|
play | |
| |<---------------- SetChunkSize ------------------|
| |<----- User Control (StreamIsRecorded) ----------|
| |<-------- UserControl (StreamBegin) -------------|
| |<---- Command Message(onStatus-play reset) ------|
| |<---- Command Message(onStatus-play start) ------|
| |------------------ Audio Message---------------->|
| |------------------ Video Message---------------->|
|
|
Keep receiving audio and video stream till finishes
a. 客户端从服务端接收到流创建成功消息,发送播放命令到服务端。
b. 接收到播放命令后,服务端发送协议消息设置块大小。
c. 服务端发送另一个协议消息(用户控制消息),并且在消息中指定事件” streamisrecorded” 和流 ID 。消息承载的头 2 个字,为事件类型,后4 个字节为流 ID 。
d. 服务端发送事件” streambegin” 的协议消息(用户控制),告知客户端流 ID 。
e. 服务端发送响应状态命令消息`NetStream.Play.Start`&`NetStream.Play.reset` , 如果客户端发送的播放命令成功的话。只有当客户端发送的播放命令设置了 `reset`命令的条件下,服务端才发送`NetStream.Play.reset`消息。如果要发送的流 没有找的话,服务端发送`NetStream.Play.StreamNotFound`消息。在此之后服务端发送客户端要播放的音频和视频数据。
- play 2
和播放命令不同,play2命令可以切换到不同的码率,而不用改变已经播放的内容的时间线。服务端对播放 2 命令可以请求的多个码率维护多个文件。 - deleteStream
当 NetStream 对象销毁的时候发送删除流命令。 - closeStream
关闭当前的NetStream。 - receiveAudio
NetStream 对象发送接收音频消息,通知服务端发送还是不发送音频到客户端。 - receiveVideo
NetStream 对象发送 receiveVideo 消息,通知服务端是否发送视频到客户端。 - publish
+-------------+ +----------+
| Client | | | Server |
+-------------+ | +----------+
| |Handshaking and Application| |
| | connect done | |
| | |
---+---- |---------Command Message(createStream) --------->|
Create | |
Stream | |
---+---- |<-------------- Command Message -----------------|
| (_result- createStream response) |
| |
---+---- |--------- Command Message (publish) ------------>|
publish | |
| |<-------- UserControl (StreamBegin) -------------|
| |---------- Data Message (Metadata) ------------->|
| |------------------ Audio Message---------------->|
| |----------------- SetChunkSize ----------------->|
| |<--------------- Command Message ----------------|
| | (_result- publish result) |
| |------------------ Video Message---------------->|
|
|
Until the stream is complete
客户端发送一个发布命令,发布一个命名流到服务端。使用这个名字,任何客户端可以播放该流并且接收音频,视频,和数据消息。
- seek
客户端发送搜寻命令在一个媒体文件中或播放列表中搜寻偏移。 - pause
客户端发送暂停命令告诉服务端暂停或开始一个命令。
聚合消息
- Message Type = 22, Aggregate message
聚合消息是含有一个消息列表的一种消息。消息类型值 22 ,保留用于聚合消息。
+---------+-------------------------+
| Header | Aggregate Message body |
+---------+-------------------------+
聚合消息的格式
+--------+--------------+--------------+--------+-------------+---------------+ - - - -
|Header 0|Message Data 0|Back Pointer 0|Header 1|Message Data 1|Back Pointer 1|
+--------+--------------+--------------+--------+--------------+--------------+ - - - -
聚合消息的body
Back Pointer包含了前面消息的大小(包括Header的大小)。这个设置匹配了 flv 文件格式,可用于后向搜索。