本文梳理了理解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 是设计用来多路复用的特