RTMP协议基本介绍

RTMP介绍:

RTMP 规范提供了一种协议,用于在 Adobe Flash Platform 技术之间进行高性能的音频、视频和数据内容的流式传输。我们提供此许可,以鼓励通过 RTMP 协议传输丰富的内容。

这篇备忘录描述了实时消息传输协议块流(RTMP块流),这是一种为多路复用和打包多媒体传输流(如音频、视频和交互式内容)而设计的应用程序级协议,它通过合适的传输协议(如TCP)进行传输。

虽然实时消息传递协议块流(RTMP Chunk Stream)被设计用于与实时消息传递协议[RTMP]一起工作,但它可以处理任何发送消息流的协议。每个消息都包含时间戳和有效载荷类型识别。RTMP块流和RTMP一起适用于各种音频-视频应用,从一对一和一对多的现场直播到点播服务,再到交互式会议应用。

当与可靠的传输协议如[TCP]一起使用时,RTMP块流提供了所有消息的保证有序端到端传递,这些消息跨越多个流,并且按照时间戳排序。RTMP块流不提供任何优先级或类似的控制形式,但可以被更高层次的协议用来提供这种优先级控制。例如,一个直播视频服务器可能会选择丢弃慢速客户端的视频消息,以确保音频消息能够及时接收,这基于发送每个消息所需的时间或确认每个消息所需的时间。

定义:

  • 负载(payload): 数据包中包含的数据,例如音频样本或压缩视频数据。负载格式及其解释超出了本文档的范围。

  • 包(packet): 一个数据包由固定的头部和有效载荷数据组成。某些底层协议可能要求定义一个数据包的封装。

  • 端口(port) : 传输协议用来区分给定主机计算机内多个目的地的“抽象”。TCP/IP 协议使用小的正整数来识别端口。OSI传输层使用的传输选择器(TSEL)等同于端口。

  • 传输地址(transport address) :  网络地址和端口的组合,用于标识传输层的一个端点,例如一个IP地址和一个TCP端口。数据包从一个源传输地址传输到一个目的传输地址。

  • 消息流(message stream) :  一个允许消息流通的逻辑通信通道。

  • 消息ID(message stream id) :  每个消息都有一个与之关联的ID,以识别它所属的消息流。

  • 块 (chunk) : 消息的一个片段。在消息被发送到网络之前,它们被拆分成更小的部分并进行交错处理。这些块确保了所有消息在多个流中的端到端按时间戳排序的交付。

  • 数据块流(chunk stream) : 一个允许特定方向上数据块流动的逻辑通信通道。数据块流可以从客户端流向服务器,也可以反向流动。

  • 数据块流id (chunk stream id ) : 每个数据块都有一个与之关联的ID,以识别它所属的数据块流。

  • 多路复用 :将单独的音频/视频数据制作成一个连贯的音视频流,使得可以同时传输多个视频和音频

  • 解复用: 复用的逆过程,其中交错的音频和视频数据被组装起来形成原始的音频和视频数据。

字节序、对齐和时间格式 (byte order, alignment and time formate) :

所有整数字段都以网络字节顺序携带,字节零是显示的第一个字节,位零是字或字段中最显著的位。这种字节顺序通常被称为大端序。传输顺序在[STD5]中详细描述。除非另有说明,本文档中的数值常量以十进制(基数10)表示。

除非另有说明,RTMP(实时消息传输)块流中所有数据都应该是字节对齐的;例如,一个16位的字段可能位于奇数字节偏移处。在指示需要填充的地方,填充字节的值应该是零。

RTMP块流中的的时间戳是以毫秒为单位的整数,相对于一个未指定的纪元。通常情况下,每个块流将从时间戳0开始,但这并不是必需的,只要两个端点对纪元达成一致即可。请注意,这意味着跨多个块流(特别是来自不同主机的块流)的任何同步都需要RTMP块流之外的某种额外机制。

时间戳必须单调递增,并且应该是时间的线性函数,以便应用程序能够处理同步、带宽测量、抖动检测和流量控制。

由于时间戳通常只有32位长,它们将在不到50天的时间内发生溢出。因为流媒体被允许连续运行,可能连续运行多年,RTMP块流应用程序必须对减法和比较使用模运算,并且应该能够启发式地处理这种回绕。只要两个端点达成一致,任何合理的方法是可以接受的。例如,应用程序可以假设所有相邻的时间戳彼此之间的时间差不超过2^31毫秒,因此10000在4000000000之后,而3000000000在4000000000之前。

时间戳增量也被指定为相对于前一个时间戳的无符号整数毫秒数。时间戳增量可以是24位或32位长。

消息格式 (message format):

一个可以被分割成多个块以支持多路复用的消息格式,取决于更高层次的协议。然而,消息格式应该包含以下字段,这些字段对于创建这些块是必要的:

  • timestamp(时间戳) :消息的时间戳。这个字段可以传输4个字节。

  • length(长度):消息负载的长度。如果消息头不能省略,它应该被包括在长度中。这个字段在块头中占用3个字节。

  • 类型id (type id): 为协议控制消息保留了一系列的类型ID。 这些传播信息的消息由RTMP块流协议和更高层次的协议共同处理。 所有其他类型ID可供更高层次的协议使用,并且对RTMP块流来说被视为不透明的值。 实际上,RTMP块流协议并不要求这些值被用作类型;所有(非协议)消息可以是同一种类型,或者应用程序可以使用这个字段来区分同时的音轨而不是类型。 这个字段在块头中占用1个字节。

  • 消息流id (message stream id) :  消息流ID可以是任何任意值。不同的消息流被多路复用到同一个块流上,它们基于各自的消息流ID进行解复用。除此之外,就RTMP块流而言,这是一个不透明的值。这个字段在块头中以小端格式占用4个字节。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值