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个字节。
1039

被折叠的 条评论
为什么被折叠?



