前面一个介绍了ogg的协议头,并且实战解析了第一个头、第二个头、第一个数据页,基本对ogg的协议解析有了一定的认知,解析了数据页,接着就是数据包了
Opus TOC 字节详解(Table of Contents)
差一点被AI带到沟里去了 ,协议原文 https://datatracker.ietf.org/doc/html/rfc6716#section-3.1
TOC(Table of Contents)字节是 Opus 音频数据包的第一个字节,它定义了该数据包的编码模式、帧大小、声道配置和帧数量等关键信息。
TOC 字节决定了解码器如何解析后续的压缩数据。
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
| config |s| c |
+-+-+-+-+-+-+-+-+
字段 | 位 | 说明 |
---|---|---|
config |
b7-b3 | 编码配置(模式、带宽、立体声等) |
s |
b2 | 立体声标志位 |
c |
b1-b0 | 帧数量代码(控制帧数) |
1. config
(5 位:b7--b3)
前 5 位的配置数定义了 32 种编码配置,不同的编码模式、音频带宽和帧长度组成了这 32 种配置,如下表所示:
+-----------------------+-----------+-----------+-------------------+
| Configuration | Mode | Bandwidth | Frame Sizes |
| Number(s) | | | |
+-----------------------+-----------+-----------+-------------------+
| 0...3 | SILK-only | NB | 10, 20, 40, 60 ms |
| | | | |
| 4...7 | SILK-only | MB | 10, 20, 40, 60 ms |
| | | | |
| 8...11 | SILK-only | WB | 10, 20, 40, 60 ms |
| | | | |
| 12...13 | Hybrid | SWB | 10, 20 ms |
| | | | |
| 14...15 | Hybrid | FB | 10, 20 ms |
| | | | |
| 16...19 | CELT-only | NB | 2.5, 5, 10, 20 ms |
| | | | |
| 20...23 | CELT-only | WB | 2.5, 5, 10, 20 ms |
| | | | |
| 24...27 | CELT-only | SWB | 2.5, 5, 10, 20 ms |
| | | | |
| 28...31 | CELT-only | FB | 2.5, 5, 10, 20 ms |
+-----------------------+-----------+-----------+-------------------+
2. s
字段(b2)
立体声标志位(s)取值 0 表示单声道,1 表示多声道立体声。【这里很多AI都把这个字段说成帧大小~~】
3. c
字段(b1--b0)------帧数量代码
c |
含义 |
---|---|
0 |
1 个 Opus 帧 |
1 |
2 个 Opus 帧(相同大小) |
2 |
2 个 Opus 帧(不同大小)→ 后跟长度字节 |
3 |
1 到 48 个帧 → 后跟一个字节表示帧数(N-1) |
TOC 解析示例
0x78 = 0x01111000
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|0 1 1 1 1|0|0 0|
+-+-+-+-+-+-+-+-+
|_______|_|___| | | | | | +-- c字段 (帧计数): 0 (00) - 表示1帧 | +----- s字段 : 0 - 表示单声道 +---------- Config字段: 15 (01111) 对照上面的表 FB (48kHz) 带宽的Hybrid模式 帧大小为20ms【14是10ms,15是20ms】
| 14...15 | Hybrid | FB | 10, 20 ms |