zoukankan      html  css  js  c++  java
  • RTMP协议

    1. 简介

    RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。

    RTMP消息块流和RTMP一起适用于多样性音视频应用程序,从一对一和一对 多向视频点播服务器直接广播到交互式会议应用程序。

    RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接。

    2. 概念

    2.1 有效负载:

    包含在每一个包中的数据,就像音视频样本或压缩后的视频数据。

    2.2 包:

    一个数据包是由固定的包头和有效的负载数据来组成的。

    2.3 端口:

    rtmp协议默认使用的是1935端口。

    2.4 消息流:

    一个通信的逻辑通道,让消息流通

    2.5 消息流id:

    每个消息拥有一个分配的id,标识消息流。

    2.6 消息块:

    消息的一个片段,一个完整的消息会被分割成小的片段,每个片段都是一个消息块。

    2.7 消息块流:

    一个通信的逻辑通道,允许消息块在一个特定方向流通,例如:从客户端到服务器。

    2.8 消息块流id:

    每个消息块有一个分配的id用于识别跟随消息块流。

    2.9 复合技术:

    把分开的音视频数据组合成一条音视频流的过程。

    2.10 逆复合技术:

    复合的反向过程,交叉存取组装的音视频数据,是他们成为最初的音视频数据。

    2.11 时间戳:

    在rtmp消息块中的时间戳使用整数来表示,但是为毫秒。时间戳必须是线性增加的,允许引用程序处理异步传输,带宽度量,检测,流控制。

    3. rtmp协议握手过程

    要建立一个有效的rtmp连接,首先经过”握手”阶段,规则如下:

    image

    客户端被指定依次向服务器发送C0,C1,C2三个chunk,服务器向客户端发送S0,S1,S2三个chunk。 详细发送要求:

    • 客户端开始发送C0,C1;
    • 客户端必须收到S1后,才发送C2;
    • 客户端必须收到S2后才开始发送其他信息(控制信息和音视频数据) 服务器要等收到C0才能发送S0和S1;
    • 服务器必须等C1后才能发送S2 服务器必须等收到C2之后才能发送其他数据(控制信息和音视频数据)

    4. rtmp通信过程

    简化如下:

    • client--> server   : 发送一个创建流的请求  (C0、C1)。
    • server--> client   : 返回一个流的索引号 (S0、S1、S2)。
    • client--> server   : 开始发送 (C2)
    • client--> server   : 发送音视频数据(这些包用流的索引号来唯一标识)

    4.1 握手第一阶段:

    image

    C0和S0都是rtmp版本包,大小1字节

    版本:8比特,C0:客户端需求的rtmp版本,S0:服务器选择的rtmp版本,如图:

    image

    image

    4.2 握手第二阶段:

    客户端发送C1包,C1包大小1536字节,格式如下图:

    image

    time:包含了一个时间戳,为了同步多个消息块流, 发送端会期望这个值是其他消息块的块流时间。

    image

    服务器应答,发送S1包,S1数据和C1完全相同。

    4.3 握手第三阶段:

    客户端发送C2包:C2包,包大小1536字节,包格式如图:

    image

    时间:4byte,这个字段必须对应发送的时间戳(C2:S1, S2:C1); 时间2:4byte,这个包含先前的每一个包被读的时间戳, 以及1528字节。

    4.4 握手完成

    消息分块:握手完成,复合多个消息分块,每个消息块有一个唯一分配的消息块流id,消息块流在网络上传输。 一个消息块发送完,才能发送下一个消息块。服务器接收完,基于消息块流id,复合成消息。

    4.5 拆分的意义

    消息块格式:

    消息块的默认大小128字节。通过set Chunk size 设置块的最大值。 格式如图:

    image

  • 相关阅读:
    angular11源码探索七[服务二]
    angular11源码探索六[服务基础一]
    有趣的特效,嘤嘤嘤
    angular11学习(十八)
    matplotlib 去掉小方框
    xlrd.biffh.XLRDError 问题报错
    页面点击出现蓝色背景色
    移动端不显示滚动条
    Swiper垂直方向滑动,高度获取不正确的解决方法
    二维树状数组
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/11363550.html
Copyright © 2011-2022 走看看