You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OGG/Opus音频文件头解析 下一分段位置计算方法问询

OGG页(header)位置的通用计算方法

OGG物理页结构是公开规范明确定义的固定格式,你之前在测试样例上跑通的计算逻辑仅匹配了样例的特殊参数,没有覆盖通用场景,按下面的固定规则计算即可准确定位所有页位置。

OGG页的固定结构(从页起始偏移0开始计数)

  • 0~3字节:固定标识OggS,4字节,用于校验是否为页起始位置
  • 4字节:流版本号,固定为0
  • 5字节:页类型标识
  • 6~13字节:绝对粒度位置(8字节小端序)
  • 14~17字节:所属流ID(4字节小端序)
  • 18~21字节:流内页序号(4字节小端序)
  • 22~25字节:页CRC校验值(4字节小端序)
  • 26字节:段表条目数,1字节无符号整数,取值范围0~255,标记后续段表的长度
  • 27字节开始:段表区域,每个条目为1字节无符号整数,条目总数等于26字节读出的数值,每个值对应当前页内一个数据段的长度

下一页位置计算逻辑

不需要解析页内的音频数据内容,只要按以下步骤计算偏移即可:

  1. 确认当前位置前4字节为OggS,标记为当前页起始位置current_pos
  2. 读取current_pos + 26位置的1字节值,记为seg_count,即段表总条目数
  3. 从current_pos + 27开始,连续读取seg_count个1字节值,全部求和得到当前页的音频数据总长度payload_total
  4. 计算到下一页的跳转步长:step = 27 + seg_count + payload_total
    • 27是固定头部的总长度(0~26共27字节)
    • seg_count是段表本身占用的字节数
    • payload_total是页内音频数据占用的字节数
  5. 从current_pos往后跳转step字节,就是下一个OGG页的header起始位置
  6. 重复上述流程直到文件末尾,即可完成整个OGG文件的顺序遍历

常见误区说明

  • 你在真实文件里读到的0x48(十进制72)就是段表条目数,代表当前页段表共有72个条目,每个条目固定占1字节,不存在3字节长度的记录结构
  • 你提到的偏移0xAC位置的0x03是段表内的普通条目,代表对应段长度为3字节,这个值会被计入payload_total的求和中,不需要单独做特殊计算
  • 你之前在示例文件中使用的计算逻辑本质是这个通用规则的特例:示例里seg_count为13,payload_total为12*255 + 182 = 3242,只是你当时把固定头部+段表的长度拆成了零散数值相加,没有抽象成通用公式,所以碰到段表条目数变化的真实文件就会失效

补充说明:如果段表最后一个条目值为0xFF(255),代表当前页承载的数据包还未结束、会延续到下一页,这个标记不影响偏移计算,不需要额外处理,直接按求和结果跳转即可。


内容的提问来源于stack exchange,提问作者james28909

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:33:19