当前位置: 首页 > news >正文

RTMP协议解析【三】

文章目录

  • RTMP协议解析【三】
  • 控制消息
    • 设置块大小(Type = 1)
    • 终止消息(Type = 2)
    • 确认消息(Type = 3)
    • 确认窗口大小消息(Type = 5)
    • 设置对端带宽消息(Type = 6)
    • 用户控制消息

RTMP协议解析【三】

本专栏重点负责介绍RTMP协议的理论部分, 跳过定义,协议与其他协议的优缺点对比,协议的拓展与改进,协议的历史发展等其他废话

本专栏重点介绍三个部分

  • RTMP的握手
  • RTMP消息
  • RTMP推流

前情简要

在RTMP协议解析【一】中,我介绍了RTMP握手的相关流程和包结构,RTMP工作流程大致如下:

  1. 客户端与服务器建立TCP连接。
  2. 双方通过握手过程确认协议版本及交换随机数等信息。
  3. 客户端发送连接命令(connect)到服务器。
  4. 服务器响应连接命令,返回连接结果。
  5. 客户端与服务器建立流(stream)进行音视频数据传输。
  6. 在传输过程中,双方可以发送控制命令,如播放(play)、暂停(pause)等。
    当连接关闭时,双方结束消息传输并断开连接。

在 RTMP协议解析【二】中我介绍了RTMP协议的Chunk格式

在本文里,我将会介绍RTMP消息的细节,具体为:

  • 控制消息
  • 用户控制消息

控制消息

RTMP协议控制消息是指Chunk Stream参数的消息

控制消息的消息类型为

  • 1
  • 2
  • 3
  • 5
  • 6

消息的Message Stream ID固定为0,Chunk Stream ID固定为2

设置块大小(Type = 1)

本控制消息用来通知对端的块大小的最大值,默认块大小为128字节,结构如下:

在这里插入图片描述

  • 第一bit必须为0
  • 后面31bit为:Chunk Size,表示此后使用此值作为最大的块大小

终止消息(Type = 2)

本控制消息用于通知对端,如果正在等待一条消息的部分块(一个Message可能由多个Chunk组成),那么可以丢弃之前已经接受到的块,对端接受到的Chunk Stream ID作为当前控制消息的有效负载。

业务层一般会在关闭的时候发送这个消息以表示不需要进一步对这个消息进行处理

整个包结构为4字节,仅1个字段:Chunk Stream ID,用来表示哪个Chunk StreamID要被丢弃

确认消息(Type = 3)

本控制消息用来在客户端或者服务端接收到等同于窗口大小的字节后必须发送对端一个确认消息。

窗口大小是指发送者在没有收到接收者的确认消息之前发送的最大字节数,本控制消息定义了序列号也就是目前为止收到的字节数

本控制消息占4字节,仅一个字段:Sequence Number,表示包含了截至目前收到的数据总和,单位为字节

确认窗口大小消息(Type = 5)

本控制字段用来在客户端或者服务端发送本消息通知对端确认消息的窗口大小,结构如下:

在这里插入图片描述

占4个字节,表示确认窗口的大小,单位为字节

设置对端带宽消息(Type = 6)

用来在客户端或者服务端发送本消息更新对端传输的带宽,输出带宽值和窗口大小值相同,如果对端在本消息中收到的值和窗口大小不相同,则发回确认窗口大小消息,结构如下:

在这里插入图片描述

  • Acknowledgement Window Size:占4字节,确认窗口的消息,单位为字节
  • Limit Type:限制消息,取值为:0(硬),1(软),或者2(动态)
    • 如果是硬限制:对端必须按提供的带宽发送数据
    • 如果是软限制:对端可以灵活决定带宽,发送端可以限制带宽
    • 如果是动态,则带宽既可以是硬限制,也可以是软限制

用户控制消息

用户控制消息用于告知对方执行该信息中包含的用户控制时间,消息类型为4,并且Message Stream ID固定为0, Chunk Stream ID固定为2

用户控制消息在接受到后,需要马上生效

结构如下:

在这里插入图片描述

  • Event Type:事件类型,占2字节,16bit
  • Event Data:事件数据

其中,Event Type取值有如下情况

取值含义描述
0stream begin服务器发送这个事件来通知客户端一个流已就绪并可以用来通信。默认情况下,这一事件在成功接收到客
1Stream EOF服务器发送这一事件来通知客户端请求的流的数据回放已经结束。在发送额外的命令之前不再发送任何数据。客户端将丢弃接收到的这个流的消息。事件数据为4字节,代表了回放已结束的流的流 ID
2StreamDry服务器发送这一事件来通知客户端当前流中已没有数据。当服务器在一段时间内没有检测到任何消息,它可以通知相关客户端当前流已经没数据了。这一事件数据为4字节,代表了已没数据的流的流 ID。
3SetBuffer Length客户端发送这一事件来通知服务器缓冲区大小 (以毫秒为单位),这个缓冲区用于缓存来自流的任何数据。
此事件在服务器开始处理流之前就发送。事件数据的前4个字节代表了流ID,紧接其后的4个字节代表了以
毫秒为单位的缓冲区的长度。
4Stream Recored服务器发送这一事件来通知客户端当前流是一个录制流。事件数据为4字节,代表了录制流的流 ID
6PingRequest服务器端发送这一事件用于测试客户端是否可达。事件数据是为一个4字节的时间戳,代表了服务器端发
送这一命令时的服务器本地时间。客户端在接收到这一消息后会立即发送 PingResponse 回复。
7PingResponse客户端发送这一事件用于回复服务器的PingRequest。事件数据是为一个4字节的时间戳,该时间戳是从接
收到的PingRequest的事件数据中获取的。

关注我,后续将会介绍RTMP的命令消息

相关文章:

  • Linux服务器SOS Report完全指南:收集方法、作用解析与最佳实践
  • WPF···
  • 哥德巴赫猜想
  • 本特利内华达125768-01 RIM i/o模块规范
  • 8.2 线性变换的矩阵
  • QT的自定义控件
  • UI自动化测试框架:PO模式+数据驱动
  • 回表是数据库概念,还是mysql的概念?
  • 业务逻辑篇水平越权垂直越权未授权访问检测插件SRC 项目
  • 86.评论日记
  • 人工智能范式:技术革命下的认知重构
  • 手机充电协议
  • AI智能分析网关V4玩手机检测算法精准管控人员手机行为,搭建智慧化安防监管体系
  • 心联网(社群经济)视角下开源AI智能名片、链动2+1模式与S2B2C商城小程序源码的协同创新研究
  • 小刚说C语言刷题—1153 - 查找“支撑数”
  • 如何理解:什么是IT到OT的技术融合?
  • SPI协议软件实现 W25QXX flash 存储器
  • HJ20 密码验证合格程序【牛客网】
  • 创建你的第一个Agent Society(CAMEL )
  • 解锁 YOLOv8 新潜能:EfficientViT 主干网络的优化实践与实验数据解读
  • 合肥野生动物园:黑帽悬猴“大壮”突发疾病,经全力抢救无效离世
  • 广东水利全面升级洪水和泄洪预警发布机制
  • 王毅会见阿富汗代理外长穆塔基
  • 中国建设银行原党委委员、副行长章更生被决定逮捕
  • 钟睒睒:不反对代工,但农夫山泉目前所有产品是无法代工的
  • 全国首例闭环脊髓神经接口手术在浙江完成,截瘫患者实现自主行走