没有合适的资源?快使用搜索试试~ 我知道了~
Adobe公司的实时消息传输协议,RTMP协议官方说明文档,中文翻译。主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信
资源推荐
资源详情
资源评论
Adobe公司的实时消息传输协议
摘要
此备忘录描述了Adobe公司的实时消息传输协议(RTMP),此协议从属于应用层,被设计用来在适合的传输协议
(如TCP)上复用和打包多媒体传输流(如音频、视频和互动内容)。
目录
1.简介
1.1.术语
2.贡献者
3.定义
4.字节序,对齐,和时间格式
5.RTMP块流
5.1.消息格式
5.2.握手
5.2.1.握手序列
5.2.2.C0和S0格式
5.2.3.C1和S1格式
5.2.4.C2和S2格式
5.2.5.握手流程图
5.3.组块
5.3.1.块格式
5.3.1.1.块的基本头
5.3.1.2.块的消息头
5.3.1.2.1.类型0
5.3.1.2.2.类型1
5.3.1.2.3.类型2
5.3.1.2.4.类型3
5.3.1.2.5.常见的头字段
5.3.1.3.扩展的时间戳
5.3.2.示例
5.3.2.1.示例1
5.3.2.2.示例2
5.4.协议控制消息
5.4.1.设置块大小(1)
5.4.2.中断消息(2)
5.4.3.应答(3)
5.4.4.应答窗口大小(5)
5.4.5.设置流带宽(6)
6.RTMP消息格式
6.1.RTMP消息格式
6.1.1.消息头
6.1.2.消息有效数据
6.2.用户控制消息(4)
7.RTMP命令消息
7.1.消息类型
7.1.1.命令消息(20,17)
7.1.2.数据消息(18,15)
7.1.3.共享对象消息(19,16)
7.1.4.音频消息(8)
7.1.5.视频消息(9)
7.1.6.集合消息(22)
7.1.7.用户控制消息事件
7.2.命令类型
7.2.1.网络连接命令
7.2.1.1.连接
7.2.1.2.调用
7.2.1.3.创建流
7.2.2.网络流命令
7.2.2.1.播放
7.2.2.2.播放2
7.2.2.3.删除流
7.2.2.4.接收音频
7.2.2.5.接收视频
7.2.2.6.发布
7.2.2.7.定位
7.2.2.8.暂停
7.3.消息交互示例
7.3.1.发布录制的视频
7.3.2.广播共享对象消息
7.3.3.从录制的流发布元数据
8.引用
作者的联系方式
简介
Adobe公司的实时消息传输协议(RTMP)提供了一套全双工的可靠的多路复用消息服务,类似于TCP协议
[RFC0793],用来在一对结点之间并行传输带时间戳的音频流,视频流,数据流。通常情况下,不同类型的消息会
被分配不同的优先级,当网络传输能力受限时,优先级用来控制消息在网络底层的排队顺序。
当前文章描述了实时消息传输协议(RTMP)的语法和实现。
术语
当前文章中的这些关键字“MUST”“MU STNOT”“REQUIRED”“SHALL”“SHALLNOT”“SHOULD”“SHOULD
NOT”“RECOMMENDED”“NOTRECOMM ENDED” “MAY”“OPTIONAL”的说明请参照[RFC2119] 中对应的描述。
贡献者
RajeshMallipeddi,Adobe公司前员工,是这份规范的原始作者,并且提供了大部分的原始文本。
M ohitSrivastava,Adobe公司员工,为这份规范的完善做出了很大贡献。
定义
有效数据
RTMP包中的数据,例如音频采样、压缩后的视频数据。有效数据的格式和说明不在本文中详述。
备
注
:
有效数据
格
式
的
定
义
请
参
考
F LV
定
义
。
包
一个数据包包括固定的包头和有效数据。一些底层协议可能需要封装包的定义。
端口
传输协议使用端口来区分同一个主机上的多个目标地址。TCP/IP协议根据正整数(端口号)来识别端口。OSI传输层使
用的传输选择器(TSEL)相当于端口。
传输地址
一个网络地址和端口的组合,用来标识传输层的一端,例如IP地址和TCP端口。数据包从源地址传输到目的地址。
消息流
一个信息流的逻辑通信信道。
消息流ID
每条消息都有一个与之相关联的ID,用来区分这条消息属于哪个流。
块
消息的一个分片。消息在被发送到网络之前,被分割成更小的部分。块可以确保在多个流之间,使用基于时间戳的方
式,端到端的交付所有消息。
块流
一个逻辑通信信道,允许块在一个特定的方向上流动。块流可以从客户机传输到服务器,也可以反向传输。
块流ID
每个块都有一个与之相关联的ID,用来区分块属于哪个流。
多路复用
将独立的音频或视频数据组合为连贯的音视频数据流,使同时传输多个视频和音频成为可能。
多路分解
多路复用的逆向过程,将混合的音视频数据拆分成独立的音频和视频数据。
远程过程调用(RPC)
允许客户端或服务器请求对端调用程序或子程序。
元数据
描述数据。电影的元数据包括标题、时间、创建日期、等等。
应用实例
当客户端发送连接请求到服务器时,会在服务器端建立一个应用实例。
动作消息格式(AMF)
一种紧凑的二进制格式,用来序列化AS对象。AMF有两个版本:AMF0、AMF3。
注
:AMF0
代
表
早期
的
flex
对
象
,
AMF3
代
表
flash
对
象
;
字节序,对齐,和时间格式
所有的整形字段使用网络字节序的方式传输,第零字节位于第一位,第零比特是双字节或字段的标志位。这种节字排
序方式通常称为大端。传输顺序的描述详见IP协议[RFC0791]。除非特别声明,本文中的数字一律为十进制。
注
:
网络
字
节
序
为
大
端
排
序
方
式
。
除非特别说明,RTMP协议中的数据都以字节对齐。例如,一个16比特数字可能位于奇数偏移字节。涉及到追加数据
的,追加字节应该为零。
RTMP的时间戳,是以毫秒为单位的整型数,使用相对时间。通常,每个流以零作为时间戳的起始,但这不是必需
的,只要他们的基准时间一样即可。注意,这意味着,任何同步传输的多个流(特别是单一主机)的时间戳需要在
RTMP协议外做一些额外处理。
时间戳是一个32位整型数,使用周期为49天17时2分47.296秒。由于,流允许连续传输数年时间,RTMP应用程序
在处理时间戳时,应该使用序列号算法[RFC1982]。例如,应用程序假设所有相邻的时间戳都在1到2^32毫秒之
间,比如4000000000后面跟着10000,3000000000在4000000000的前面。
时间戳增量是相对于前一个时间戳的无符号整型数。时间戳增量可以是24位或者32位。
RTMP块流
本讲述了实时消息传递协议块流(RTMP块流)。它作为一款高级多媒体流协议提供了流的多路复用和打包服务。RTMP
块流被设计用来传输实时消息协议(第6章),它可以使用任何协议来发送消息流。每个消息都包含时间戳和有效类型
标识。RTMP块流和RTMP适用于各种视听传播的应用程序,包括一对一的,和一对多的视频直播、点播服务、互动会
议应用程序。
当使用一个可靠的传输协议如TCP[RFC0793]时,RTMP块流提供了一种可以在多个流中,基于时间戳的端到端交付
所有消息的方法。RTMP块流不提供任何优先级或类似形式的控制,但可以使用更高级别的协议来提供这样的优先
级。例如,一个视频服务器可以根据发送的时间或确认每个消息的时间,来决定为一个网络差的用户丢弃视频信息,
以确保音频信息的及时接收。
RTMP块流不仅包含了自己的协议控制信息,同时也提供了一个更高级别的协议机制,用来嵌入用户自定义控制信
息。
消息格式
消息格式可以被分割成多个块,用来在更高的协议中支持多路复用。在创建块消息格式时,应该包含以下字段:
时间戳
消息的时间戳。这个字段占用4字节。
长度
消息的有效长度。如果消息头不能被忽略,它应该包括长度。这个字段在块头中占用3字节。
类型ID
各种类型的协议控制消息的ID。这些消息使用RTMP块流协议和更高级别的协议来传输信息。所有其他类型的ID可以
用在高级协议,这对于RTMP块流来说,是不透明的。事实上,RTMP块流中没有要求使用这些值作为类型;所有(无
协议的)消息可能是相同的类型,或者应用程序使用这个字段来区分多个连接,而不是类型。这个字段在块头中占用1
字节。
消息流ID
消息流ID可以是任意值。当同一个块流被复用到不同的消息流中时,可以通过消息流ID来区分它们。另外,对于
RTMP块流而言,这是一个不透明值。该字段占用4字节,使用小端序。
握手
RTMP连接从握手开始。它包含三个固定大小的块,不像其他的协议,是由头部大小可变的块组成的。
客户端(初始化连接的一端)和服务端发送同样的三个块。为了方便描述,客户端发送的三个块命名为C0,C1,
C2;服务端发送的三个块命名为S0,S1,S2。
握手序列
客户端通过发送C0和C1消息来启动握手过程。客户端必须接收到S1消息,然后发送C2消息。客户端必须接收到S2
消息,然后发送其他数据。
服务端必须接收到C0或者C1消息,然后发送S0和S1消息。服务端必须接收到C1消息,然后发送S2消息。服务端必
须接收到C2消息,然后发送其他数据。
C0和S0格式
C0和S0包由一个字节组成,下面是C0/S0包内的字段:
01234567
+++++++++
|version|
+++++++++
C0andS0bits
14B版本
版本(8比特)
在C0包内,这个字段代表客户端请求的RTMP版本号。在S0包内,这个字段代表服务端选择的RTMP版本号。此文档
使用的版本是3。版本02用在早期的产品中,现在已经被弃用;版本431被预留用于后续产品;版本32255(为
了区分RTMP协议和文本协议,文本协议通常以可打印字符开始)不允许使用。如果服务器无法识别客户端的版本
号,应该回复版本3。客户端可以选择降低到版本3,或者中止握手过程。
C1和S1格式
C1和S1包长度为1536字节,包含以下字段:
0123
01234567890123456789012345678901
+++++++++++++++++++++++++++++++++
|time(4bytes)|
+++++++++++++++++++++++++++++++++
|zero(4bytes)|
+++++++++++++++++++++++++++++++++
|randombytes|
+++++++++++++++++++++++++++++++++
|randombytes|
|(cont)|
|....|
+++++++++++++++++++++++++++++++++
C1andS1bits
14B时间
58B零
91536B其他数据
时间(4字节)
本字段包含一个时间戳,客户端应该使用此字段来标识所有流块的时刻。时间戳取值可以为零或其他任意值。为了同
步多个块流,客户端可能希望多个块流使用相同的时间戳。
零(4字节)
本字段必须为零。
随机数据(1528字节)
本字段可以包含任意数据。由于握手的双方需要区分另一端,此字段填充的数据必须足够随机(以防止与其他握手端
混淆)。不过没必要为此使用加密数据或动态数据。
C2和S2格式
C2和S2包长度为1536字节,作为C1和S1的回应,包含以下字段:
0123
01234567890123456789012345678901
+++++++++++++++++++++++++++++++++
|time(4bytes)|
+++++++++++++++++++++++++++++++++
|time2(4bytes)|
+++++++++++++++++++++++++++++++++
|randomecho|
+++++++++++++++++++++++++++++++++
|randomecho|
|(cont)|
|....|
+++++++++++++++++++++++++++++++++
C2andS2bits
14B时间
58B时间
91536B其他数据
时间(4字节)
本字段必须包含对端发送的时间戳。
时间(4字节)
本字段必须包含时间戳,取值为接收对端发送过来的握手包的时刻。
随机数据(1528字节)
本字段必须包含对端发送过来的随机数据。握手的双方可以使用时间1和时间2字段来估算网络连接的带宽和/或延
迟,但是不一定有用。
握手过程示意图
++++
|Client|TCP/IPNetwork|Server|
++|++
|||
Uninitialized|Uninitialized
|C0||
|>|C0|
||>|
|C1||
|>|S0|
||<|
||S1|
Versionsent|<|
|S0||
|<||
|S1||
|<|Versionsent
||C1|
||>|
|C2||
剩余30页未读,继续阅读
资源评论
遇见里哦
- 粉丝: 7
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功