本文梳理了理解RTMP协议的基本概念
访问我的博客了解更多
RTMP 的 message 与 chunk
message 是 RTMP 中的 M,是消息的单位
RTMP Message Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type| Payload length|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream ID |
+-+-+-+-+-+-+-+-+-+-+-+-+
- Message Type(1 byte),消息类型很重要,它代表了这个消息是什么类型,当写程序的时候需要根据不同的消息,做不同的处理。
- Payload length(3 bytes),表示负载的长度(big-endian 格式)
- Timestamp (4 bytes),时间戳(big-endian 格式),超过最大值后会翻转
- Stream ID (3 bytes) ,消息流ID(big-endian 格式),用于区分不同流的消息。
- Message Payload,真实的数据
message 的类型
消息主要分为三类: 协议控制消息、数据消息、命令消息等
-
协议控制消息
- Message Type ID = 1~6,主要用于协议内的控制
-
数据消息
- Message Type ID = 8 9 18
- 8: Audio 音频数据
- 9: Video 视频数据
- 18: Metadata 包括音视频编码、视频宽高等信息。
- Message Type ID = 8 9 18
-
命令消息 Command Message (20, 17)
- 此类型消息主要有 NetConnection 和 NetStream 两个类,两个类分别有多个函数,该消息的调用,可理解为远程函数调用。
更多的了解见 Adobe’s Real Time Messaging Protocol 的 5.4 章节
Chunk —— 网络中实际发送的内容
rtmp 的 message 会切分为 n 个 chunk,再通过 tcp 协议传输
为什么 rtmp 基于 tcp 协议,tcp 协议已经有化整为零的方式, rtmp 还需要将 message 划分更小的单元 chunk 呢?
分析原因:
- tcp 协议划分一个个 tcp 报文,是为了在网络传输层上保障数据连续性,丢包重发等特性
- rtmp 划分 chunk 消息快,是为了在网络应用层上实现低延迟的特性,防止大的数据块(如视频数据)阻塞小的数据块(如音频数据或控制信息)
RTMP 的 chunk 设计思想
在互联网中传输数据时, 消息(Message)会被拆分成更小的单元, 称为消息块(Chunk)。RTMP Chunk Stream 层级允许在Message stream 层次,将大消息切割成小消息,这样可以避免大的低优先级的消息(如视频消息)阻塞小的高优先级的消息(如音频消息或控制消息)。
重复强调,RTMP 是设计用来多路复用的特点,传输内容有视频、音频、控制命令。其中一个非常重要的概念是 multiplexing
(复用)
不同类型的消息会被分配不同的优先级,当网络传输能力受限时,优先级用来控制消息在网络底层的排队顺序。
比如当客户端网络不佳时,流媒体服务器可能会选择丢弃视频消息,以保证音频消息可及时送达客户端。
Chunk 的大小设置,通过 Message Type = 1 的控制消息声明
如果 message length 大于 max chunk size,则需要将这个message切分为多个 chunk 。前面几个 chunk size 必须是 max size,最后一个就是剩余的大小。
以上图为例,Message大小为 300 bytes,默认Chunk size 为 128 bytes,进行拆分成chunk的过程。
接下来,探寻 chunk 的结构
RTMP Chunk Header
+-------------+----------------+-------------------+-----------+
| Basic header|Chunk Msg Header|Extended Time Stamp|Chunk Data |