了解 ogg header 格式的规范

Understanding the spec of the ogg header format

为了编写自己的 ogg-container-class(不使用 libogg),我尝试理解所需的 header 格式。根据 spec, at byte 27 of the stream (starting to count at 0) starts the "segment_table (containing packet lacing values)". This is the red marked byte 13. Concerning the Opus-data that I want to include, the Opus data must 开始以 OpusHead (4F 70 75 73) 开头。为什么它不从放置红色 13 的位置 27 开始? 13 是一个 "device control 3" 符号,既不出现在 Ogg 规范中,也不出现在 Opus 规范中。

编辑:我发现 this link 稍微描述了规范。在那里变得很清楚(这不是来自第一个 link 恕我直言)13(字节 27)是以下段的大小。

这似乎是一个字节,给出了以下 segment_table 数据的长度。所以有 13(十六进制)字节(16 十进制)字节的 segment_table 数据。

RFC 3533 是对格式 header.

的更详细描述

字节 26 表示段 table 占用了多少字节,所以你读到它,加上 27,它告诉你第一个数据包从哪里开始(或继续)。

段table告诉您封装数据包的长度。基本上,您通读 table,将每个连续字节中的值加在一起。如果您刚刚添加的值 < 255 则标记数据包边界,因此记录累加器的当前值,将其重置为零,然后继续直到到达 table.

的末尾

在您的示例中,字节 26 中的段 table 大小为 1,因此数据从 27+1 或字节 28 开始,这是 'OpusHead' 字符串的开头。 1 字节段 table 中的值为 0x13,因此数据包长 19 字节。 28+19 是 47(或 0x2f),它是下一个 header.

开始时 'OggS' 捕获模式的开始

这种稍微复杂的算法旨在为许多具有有限开销的小数据包存储成帧数据,同时仍然允许任意大的数据包。另请注意,数据包可以在页面之间继续,跨越 2 个或更多段 tables.