这一篇笔记主要记录对 chunk 和 message 两个概念的理解。
一个不严谨的比喻
如果把一条 TCP 链接比喻成一条铁路,那么:
- 一个字节就是一份货物。
- 一个 chunk 就是一辆火车。
- 一条 chunk stream 就是一条轨道。
- 一份 message 就是包含若干货物的清单,这些货物被装载至一辆或多辆火车(chunk)上。

需要注意:
- 两个方向上的 chunk stream 数量无需相等,编号可同可不同。
- 同一个 message 产生的多个 chunk 只会在一条 chunk stream 串行发送。
- 先发送的 chunk 一定先到达。
- 多条 chunk stream 复用了一条 TCP 链接。
说的直接点:
- chunk 就是一个报文——预先约定清楚的 header 字段(ID,类型,时间戳等等),以及变长的负载数据(chunk data)。
- chunk stream 就是一串有相同 ID 的 chunk,借助 TCP 链接在网络上流动,从发送端流向接收端。
Chunk - 最小传输单元(这名是我胡诌的)
在 RTMP 层面,chunk 就是最小的传输单元,数据封装为 chunk 后方能通过 RTMP 协议进行发送。
Chunk 的字段可划分为四部分,如下图示:

Basic Header (1 - 3 bytes)
本部分包含两个字段,format 和 chunk stream id。
Format 仅占两个比特,其值决定了 message header 的长度。
Chunk stream id 是一个变长的整数,取值范围为 [2, 65599],可能占用 14,22 或 6 个比特。
CS ID 占用 14 个比特
RTMP规定当第 2 - 7 个比特的值为 0 时,chunk stream id 占用 14 个比特,其值减去 64 后存储在第 8 - 15 个比特中。取值范围为 [64, 319]。

CS ID 占用 22 个比特
RTMP规定当第 2 - 7 个比特的值为 1 时,chunk stream id 占用 22 个比特,其值减去 64 后存储在第 8 - 23 个比特中。取值范围为 [64, 65599]。

CS ID 占用 6 个比特
RTMP规定当第 2 - 7 个比特的值在区间 [2,63] 内时,这 6 比特数据就是 chunk stream id。

Message Header (0, 3, 7, or 11 bytes)
Meassage header 的格式依赖 basic header 中的 format 一起解释。
Format 0 (11 bytes)
此时 message header 占用 11 字节,包含四个字段,如下图示:

Timestamp (3 bytes)
这是一个很重要的字段,FFmpeg 会用其值计算帧的 DTS 和 PTS。
Message Length (3 bytes)
该字段用来描述 message 的长度。注意,是 message 的长度,而非 chunk data 的长度。
Message Type ID (1 byte)
该字段用来描述 message 的类型,后面再详细介绍。
Message Stream ID (4 bytes)
一个 message 可能被封装为多个 chunk,这些 chunk 的 message stream id 的值均相同。
在接收端,会按照先后次序,将具有相同 chunk stream id 和 message stream id 的 chunk 解封为一个 message。配合 message length 字段可判断是否完整接收了一个 message,具体判断逻辑下文有记录。
Format 1 (7 bytes)
此时 message header 占用 7 字节,各字段如下图所示:

相较于 format 0 的字段,这里有两处改动:
移除 Message Stream ID
没有 message stream id,那接收端如何确认该 chunk 应该解封至哪个 message 呢?
RTMP 规定,当 chunk 的 format 不等于 0 时,其 message stream id 的值等于最近一个具有相同 ch

这篇笔记深入探讨了RTMP协议中的chunk和message概念。chunk作为传输的基本单位,包含BasicHeader、MessageHeader和ChunkData等部分,而message由header和body组成,可被拆分成多个chunk进行传输。文章详细阐述了chunk的四种format,messageheader的结构,以及timestamp和timestampdelta的计算方式。此外,还介绍了RTMP中不同类型的message,包括音频、视频、命令和数据消息。
最低0.47元/天 解锁文章
618

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



