RTMP(Real-Time Messaging Protocol,实时消息传输协议)是一种用于音视频和数据在互联网进行实时传输的协议,最初由Macromedia(现Adobe)开发,用于与Adobe Flash Player进行通信。RTMP被广泛用于流媒体传输,特别是在直播和点播视频领域。以下是RTMP协议的详细介绍:
RTMP协议的基本原理
RTMP协议是基于TCP的协议,通过分段传输数据以实现低延迟的实时传输。其主要功能是支持多路复用和流控制,使音视频数据可以同步传输并在接收端及时播放。
RTMP的基本结构
RTMP协议将数据分为消息(Message)和消息流(Message Stream),并在较低层次上定义了Chunk(块)的概念。
- Chunk:RTMP数据传输的基本单位,一个大消息可以被分割成多个Chunk以便传输。
- Message:由多个Chunk组成,表示一个完整的RTMP数据单元,比如音频数据、视频数据或控制信息。
- Message Stream:用来传输一系列相关的消息,比如一个音频流或一个视频流。
RTMP协议的通信过程
RTMP协议的通信过程分为以下几个阶段:
- 握手阶段:客户端和服务器首先进行握手以建立连接,完成版本和时间戳的同步。
握手过程 官方文档示例如下:
RTMP 真实握手过程:
- 连接阶段:握手完成后,客户端发送连接命令(connect),包括应用信息等,服务器响应连接成功或失败。
官方文档仅供参考:
实际抓包分析:
- 创建流阶段:连接建立后,并不是发送裸数据,而是客户端请求创建一个或多个流,用于音视频数据的传输。
官方文档,仅供参考:
通过抓包分析:
- 音视频数据传输阶段:客户端和服务器通过已经建立的流传输音频、视频和数据消息。
推流过程如下:
拉流过程如下:Buffer Size 播放越平滑,不易出现卡顿,但是延迟相对会较高
RTMP消息格式
总体框图如下:
RTMP消息格式主要由以下几个部分组成:
1. Chunk(块)格式
RTMP协议使用Chunk来分割和传输数据。Chunk是RTMP数据传输的基本单位,一个消息可以被分割成多个Chunk传输。每个Chunk包含以下几个部分:
- Basic Header:包含Chunk Stream ID和Chunk的基本信息。
- Message Header:包含消息的元数据,比如时间戳、消息长度、消息类型等。
- Extended Timestamp(可选):用于扩展时间戳,当时间戳超过24位时使用。
- Message Data:实际的数据内容。
Basic Header
Basic Header由1到3个字节组成:
-
第1字节
:格式(Format)和Chunk Stream ID(CSID)。
- Format:2位,表示Chunk的格式。
- CSID:6位或更长,表示Chunk流ID。
如果CSID为0,则需要使用1个额外字节表示CSID(范围为64-319)。如果CSID为1,则需要使用2个额外字节表示CSID(范围为64-65599)。
Message Header
Message Header的长度取决于Basic Header中的Format字段,可能为0、3、7或11字节:
- Format 0(11字节):包含时间戳、消息长度、消息类型ID、消息流ID。
- Format 1(7字节):包含时间戳差值、消息长度、消息类型ID。
- Format 2(3字节):仅包含时间戳差值。
- Format 3(0字节):不包含任何头部信息,仅复用之前Chunk的头部信息。
Extended Timestamp
Extended Timestamp(4字节):仅当时间戳或时间戳差值超过24位时使用。
2. Message(消息)格式
RTMP消息包含消息头和消息体,消息头定义了消息的元数据,消息体包含实际的数据。
Message Header
消息头包含以下字段:
- Timestamp(3字节):消息的时间戳,单位为毫秒。
- Message Length(3字节):消息体的长度,单位为字节。
- Message Type ID(1字节):表示消息的类型,比如音频、视频、命令等。
- Message Stream ID(4字节):表示消息流的ID。
Message Body
消息体是实际的数据内容,其长度由消息头中的Message Length字段指定。
3. 消息类型
RTMP定义了多种消息类型,每种类型都有特定的用途:
- Audio Message(8):用于传输音频数据。
- Video Message(9):用于传输视频数据。
- Data Message(18):用于传输元数据或自定义数据,比如时间戳、脚本数据等。 RMTP命令消息
- Command Message(20):用于命令和控制消息,比如连接、发布、播放等。RTMP命令消息
- User Control Message(4):用于用户控制事件,比如流开始、流结束、Ping等。
- Aggregate Message(22):用于聚合多个消息成一个传输。
- Set Chunk Size(1):控制消息
- Abort Message(2):控制消息