1

For writing my own ogg-container-class (not using libogg), I try to understand the needed header format. According to the 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 start with OpusHead (4F 70 75 73) on its beginning. Why doesn't it start on position 27 where the red 13 is placed? A 13 is a "device control 3" symbol that neither occurs in the Ogg spec, nor in the Opus spec.

编辑:我发现这个链接描述了一些规范。很明显(不是来自第一个链接恕我直言)13(字节27)是下一个段的大小。

在此处输入图像描述

4

2 回答 2

2

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

于 2015-07-16T07:28:35.900 回答
0

RFC 3533是对格式头的更详细的描述。

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

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

在您的示例中,字节 26 中的段表大小为 1,因此数据从 27+1 或字节 28 开始,这是“OpusHead”字符串的开始。1字节段表中的值为0x13,所以数据包长19字节。28+19 是 47(或 0x2f),它是下一个标头开始处的“OggS”捕获模式的开始。

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

于 2015-09-30T22:59:41.637 回答