直播技术--RTMP协议篇

2019-10-10  本文已影响0人  d8893ea8ba05

协议的位置

RTMP与HTTP属于同一个层级,都位于TCP/IP协议簇中的应用层

握手

握手过程涉及到客户端发送的三个包c0、c1、c2和服务端发送的三个包s0、s1、s2,且满足如下要求

c0和s0版本确定

c0和s0都是八个字节,只包含版本号信息,c0发送自己的版本号,s0返回服务端支持的版本号,如果服务端不支持客户端的版本号,那么默认返回3,客户端根据服务端的版本号来确定是否降级或放弃握手

c1和s1
c2和s2
实际握手过程

数据传输

在RTMP中数据传输的逻辑单元被成为消息,然后在实际传输的过程中,每条消息被切割成为消息块在网络上传输,这样可以很好地避免内容较大的消息阻塞了后面内容较小但是优先级更高的消息,如音频或控制数据


数据结构
消息格式
消息块格式

握手完成后,连接复用一个或多个块流,每个块流承载来自同一个消息流的同一类消息。创建的每个块都有一个唯一的块流ID,这些块通过网络进行传输。 在传输过程中,必须一个块发送完毕之后再发送下一个块。在接收端,将所有块根据块中的块流ID组装成消息。
分块将上层协议的大消息分割成小的消息,保证大的低优先级消息(比如视频)不阻塞小的高优先级消息(比如音频或控制消息)。
分块还能降低消息发送的开销,它在块头中包含了压缩的原本需要在消息中所包含的信息。
块大小是可配置的,这个可以通过一个设置块大小控制消息进行设定修改。越大的块CPU使用率越低,但是在低带宽的情况下,大的写入会阻塞其他内容的写入;而小一些的块不适合高比特率的流。块大小在每个方向上保持独立

基本头

块基本头编码块流ID和块类型(用fmt字段表示),块类型决定了消息头的编码格式,块基本头长度可能是1,2或3字节,这取决于块流ID的长度。
RTMP最多支持65597个流,ID在3-65599范围内。ID0,1,2为保留值。
第一个字节的前两位fmt用来标识块消息头的类型,块流id称为csid,基本头编码的目的是用最小的长度来标识尽可能多的id,于是有了下面的规则:

块消息头

块消息头共有4种不同的格式,根据块基本头中的"fmt"字段值来选择

扩展时间戳

扩展时间戳用来辅助编码超过16777215(0xFFFFFF)的时间戳或时间戳增量,也就说0,1或2
类型的块,无法用24位数字来表示时间戳或时间戳增量时,既0类型块的时间戳字段或1,2类
型的时间戳增量字段值为16777215(0xFFFFFF)时。当最近的属于相同块流ID的0类型块、1
类型块或2类型块有此字段时有此字段时,3类型块也应该有此字段。

消息分块范例

协议控制消息

RTMP块流用消息类型ID 1,2,3,5和6来作为协议控制消息,这些消息包含RTMP块流协议所需要的信息。。这些协议控制消息必须用 0 作为消息流ID,并在ID为2的块流中发送。协议控制消息收到后立即生效,它们的时间戳信息是被忽略的。

用户控制消息

RTMP协议将消息类型 4 作为用户控制消息ID,用户控制消息应该使用ID为0的消息流(控制流),并且通过RTMP块流传输时使用ID为2的块流。用户控制消息收到后立即生效,它们的时间戳信息会被忽略。
客户端或服务端通过发送该消息告知对方用户控制事件。该消息携带事件类型和事件数据两部分。开头的2个字节用于指定事件类型,紧跟着是事件数据。事件数据字段长度可变,但是如果用RTMP块流传输,则消息总长度不能超过最大块大小,以使消息可以使用一个单独的块进行传输。

其他消息类型

客户端和服务端通过在网络上发送消息来实现交互,消息可以是任意类型,包括但不限于音频消息、视频消息、指令消息、共享对象消息、数据消息和用户控制消息。

交互过程

上一篇 下一篇

猜你喜欢

热点阅读