二、RTMP块流的重新构建
RTMP块流是一种用于实时消息传递的协议,提供了流的多路复用和打包服务。它可以通过任何协议来发送消息流,并且每个消息都包含时间戳和有效类型标识。RTMP块流广泛应用于各种视听传播应用程序,包括一对一和一对多的视频直播、点播服务以及互动会议应用程序。当使用可靠的传输协议如TCP时,RTMP块流可以在多个流中基于时间戳实现端到端的消息交付。尽管RTMP块流本身不提供优先级或类似的控制,但可以通过更高级别的协议来实现这些功能。例如,视频服务器可以根据发送时间或确认消息的时间来决定是否丢弃视频信息,以确保音频信息的及时接收。此外,RTMP块流不仅包含自己的协议控制信息,还提供了嵌入用户控制信息的机制。
消息格式可以被分割成多个块,以支持多路复用。在创建块消息格式时,应包含以下字段:时间戳、长度、类型ID和消息流ID。时间戳字段占用4字节,用于标识消息的时间。长度字段占用3字节,表示消息的有效长度。类型ID字段占用1字节,用于标识各种类型的协议控制消息。消息流ID字段占用4字节,用于区分不同的消息流。握手过程是RTMP连接的起始阶段,包括C0、C1、C2、S0、S1和S2六个固定大小的块。客户端和服务端通过交换这些块来完成握手。
C0和S0包含一个字节,表示RTMP的版本号。在C0包中,版本号字段代表客户端请求的RTMP版本号;在S0包中,版本号字段代表服务端选择的RTMP版本号。本文档使用的版本号是3,而版本号0-2已被弃用,版本号4-31被预留用于后续产品,版本号32-255不允许使用。如果服务器无法识别客户端的版本号,应回复版本3。客户端可以选择降低到版本3或中止握手过程。
C1和S1包长度为1536字节,包含时间、零和随机数据字段。时间字段占用4字节,用于标识所有流块的时刻。零字段占用4字节,必须为零。随机数据字段占用1528字节,可以包含任意数据,用于区分握手的双方。
C2和S2包长度为1536字节,作为C1和S1的回应,包含时间、时间和随机数据字段。时间字段必须包含对端发送的时间戳,时间字段必须包含接收对端发送的握手包的时刻,随机数据字段必须包含对端发送的随机数据。握手的双方可以使用时间字段来估算网络连接的带宽和延迟。
以上是关于RTMP块流的重新构建内容。如果您对音视频开发有兴趣,可以加入我们的学习交流群或点击获取最新的学习资料和教学视频。
三、RMTP握手握手过程示意图
下面是握手过程示意图中提到的状态:
- 未初始化:在此阶段,客户端和服务器均处于未初始化状态。客户端发送携带协议版本号的C0包。如果服务器支持此版本,回复S0和S1包。如果服务器不支持此版本,采取适当的动作回复,通常是中止连接。
注:如果服务器不支持客户端的版本号,可以选择降到版本3或中止握手过程。
-
发送版本:客户端和服务器在未初始化状态后进入发送版本状态。客户端等待S1包,服务器等待C1包。待接收到数据包后,客户端发送C2包,服务器发送S2包。然后,双方都进入答复状态。客户端等待C2的答复,服务器等待S2的答复。
-
握手完成:客户端和服务器交换消息,完成握手过程。
如果您对音视频开发有兴趣,可以自行添加学习交流群或点击获取2022年最新的学习资料和教学视频。