您的位置:首页 > 科技 > IT业 > RTMP协议讲解

RTMP协议讲解

2024/12/25 12:45:37 来源:https://blog.csdn.net/qq_54089476/article/details/141122699  浏览:    关键词:RTMP协议讲解
  • 什么是RTMP协议?

RTMP协议是实时消息传输协议的缩写(Real Time Messaging Protocol)的缩写。RTMP协议是基于TCP协议开发的消息传输协议,它是Adobe公司开发的一种私有传输协议。它主要的用途是音视频推流、实时交互语音和数据交互等功能。

  • RTMP的交互流程:

RTMP交互的过程总共可以分为以下几步:握手、建立网络对话、创建网络流、播放。握手,RTMP的握手主要是TCP和RTMP协议之间的握手,它是整个交互过程的开始。建立网络对话,当握手成功之后,就要建立起Client和Server端的连同关系。建立网络流,就是当网络会话建立成功后,建立起发送多媒体数据的通道。播放,指的是Client和Server传输音视频数据的过程。下面是一个大体的RTMP 客户端和服务端交互的过程。

  • RTMP通信步骤的讲解:

3.1. 握手:

一个RTMP的开始都是以握手开始的,握手的过程分别为以下步骤:

1). Client端发送C0(版本号),C1(随机字符串)到Server,而Server收到C0或者C1后发送应答S0,S1

2). 当Client收到Server端发来的应答数据S0(版本号),S1(随机字符串)后,则发送C2数据到Server。若此时Server同时收到C0、C1后,就开始发送S2到Client

3). 当Client端和Server端分别收到S2和C2信号后,则代表握手完成。

3.2.建立网络会话

1). Client端发送Connect指令到Server端,这个指令的用处就是请求和Server端建立一个连接。

2). Server端接收到Client端发送的指令后,接着发送窗口协议到Client端,并同时连接到应用程序。

3). Server端发送设置带宽的协议到Client端

4). Client端处理带宽协议后,发送确认窗口大小协议到Server端

5). Server端发送用户控制信息指令“Stream Begin”到Client端

6). Server端发送用户消息指令”_result”通知Client端连接状态

3.3.建立网络流(NetStream)

1). Client端发送指令”createStream”到Server端

2). Server端接收到”createStream”指令后,则成功创建网络流。S并同时发送”_result”指令通知Client端.

3.4.播放流(Play)

1). Client端发送指令”play”到Server端。

2). Server端接收后,Server端发送ChunkSize协议消息到Client端

3). Server端发送控制指令”streambegin”给Client端

4). 若3)步发送成功之后,Server端会发送”响应状态” NetStream.Play.Start & NetStream.Play.reset通知客户端“Play”指令成功。

  • RTMP消息协议的讲解

RTMP的消息协议一般分为三种,分别是消息(Message)、消息块(Chunk)、消息分块(Msg)

4.1. 消息(Messgae)

Message是RTMP传输协议的最基本单元。在Messgae中,不同类型的Messgae含有不同的Message Type Id。在RTMP协议中,一共有十几种Message Type,比方说Message Type ID区间在1-6则代表此消息协议是控制协议。

Message Type ID为8代表的是此消息传输音频数据,若Message Type ID 为9则代表的是此消息传输的是视频数据。Message Type ID区间在15到20则用于发送AMF编码指令(AMF指的是Flash和服务端常见的编码方式),比方说播放、暂停、Client和Server端进行交互等。

说完Message Type Id后,我们来介绍一下Message的首部信息(Message Header),Message Header是由四元组组成,Message Type Id(消息类型ID)、Payload Length(消息长度)、TimeStamp(标识符时间戳),Stream Id(消息流ID)。具体的我们来看下图(B代表的是字节):

下面的表格是Message Type ID的分类:

4.2. 消息块(Chunk)

由于在网络传输中,若网络环境不好的情况下,一个消息单元需要拆分成数据量更小的数据块才能够适应网络的传输。在RTMP协议中规定,每个消息都需要被拆分才能够正常传输。拆分的消息分块(Chunk)由Chunk Header 和 Chunk Data组成。Chunk Header由三部分组成:Chunk Basic Header(块基本头)、Chunk Message Header(块消息头)、Extended TimeStamp(扩展时间戳),具体的如下图:

4.2.2.1.Chunk Basic Header这个字段包含流ID(chunk stream id)和分块类型(fmt),流id一般用csid来表示,chunk type决定了Message Header的格式,Chunk Type长度固定为2bit。若Basic Header长度等于1Byte,则cs id取值范围在[0,64]。

而CSID: 0, 1是由协议保存的特殊协议:0代表的是整个Chunk Basic Header要占用两个字节,CSID的取值范围是[64,319]; 1代表的还是占用三个字节,CSID取值范围[64,65599]。

Chunk Basic Header:1 Byte (8 bit)

Chunk Basic Header2 Byte (16bit),csid = 0

上面这个图是chunk basic header长度为2byte的情况,这种chunk header的特点是type所在的位置全部设置成0。而第三个字节用CSID----64表现出来,CSID取值范围是[64,319]。

Chunk Basic Header3 Byte (24bit),csid = 1

上面这个图是chunk basic header长度为3byte的情况,这种情况的chunk header的特点是,第一个字节的位置全部设置为1。而剩余的CSID取值的范围是[64,65599]。

4.2.2.2.Chunk Message HeaderChunk Message Header一般分成四种类型的消息头,分别是0, 1 , 2 , 3。Message Header主要包含了要发送的具体信息。

Chunk Type(fmt) = 0,占用11bytes(88bit)

当fmt = 0的时候,整个Message Header占用了11个字节,下面我们来分析每一个数据单元的作用:

TimeStamp(时间戳):表示的是时间戳,占用三个字节。它代表的是解析时候的实时时间戳,它最大的取值范围是0xffffff,当时间戳超过这个最大值的时候,所有字节位设置为1。

Message Length(消息数据的长度):Message Length也和TimeStamp一样占用3个字节,它代表的是实际发送的数据信息,比方说:音频数据长度、视频数据长度。这里要注意的是,Message Length是整个Chunk的总长度,并不是Chunk Data的长度

Message type id(消息类型id)消息类型id占用1个字节,它代表的是实际发送数据的类型id,比方说: 8代表的是音频数据、9代表的是视频数据。

Message stream id(消息流id)消息流id占用4个字节,它代表的是chunk所在的流id。

Chunk Type(fmt) = 1,占用7bytes(56bit)

当Chunk Type等于1的时候,没有了表示message stream id的字段(总共占用4个字节),另外这里的时间戳也变成了TimeStamp Delta。TimeStamp Delta和TimeStamp最大不同的是,它存储的是和上一个Chunk的时间差,其他的和TimeStamp相似。

Chunk Type(fmt) = 2,占用3bytes(24bit)

当ChunkType等于2的时候,整个结构就更简单了,仅仅只有一个TimeStampDelta单元。它占用3个字节,它表示的是所在的流信息、消息长度和类型都是相同的。剩余的所有字节都来表示TimeStamp Delta。

Chunk Type(fmt) = 3,占用0bytes(0bit)

当type == 3的时候,为0个字节。它代表的是此Chunk的Message Header和前一个Message Header所有信息都相同。

4.2.2.3Extended TimeStamp(扩展时间戳):

这个值默认为0,当启动这个值的时候,timestamp和timestamp delta全部设置为1。

4.3.消息分块(Msg)

在网络传输中,每一个RTMP协议单元都需要被分割成一块一块内容才能够发送。其中Message Body指的是每一个分割消息的负载部分,而每个被分割的数据块大小固定为128个字节,并且在首部加上Chunk Header就组成了一块完整的消息分块。一个大小为307个字节的消息分块,被分割成128个字节进行传输。

                (图1:这个是一块完整的消息分块,默认307个字节)

           (图二:这个是把307个字节的消息块,分割成每个128个字节)

(图三:是剩余51个字节的消息块)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com