RTMP(2):Chunk 和 Message

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

这一篇笔记主要记录对 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值