2015-07-15 5 views
1

Для написания моего собственного класса ogg-container (не используя libogg), я пытаюсь понять необходимый формат заголовка. Согласно spec, в байте 27 потока (начиная отсчет в 0) начинается «segment_table (содержащая значения шнуровки пакета)». Это красный отмеченный байт 13. Что касается данных Opus, которые я хочу включить, данные Opus must начинаются с OpusHead (4F 70 75 73) с самого начала. Почему он не начинается с позиции 27, где находится красный 13? A 13 является символом «управления устройством 3», который не встречается в спецификации Ogg или в спецификации Opus.Понимание спецификации формата заголовка ogg

EDIT: Я нашел this link, который описывает спецификацию немного. Там становится ясно (что не из первой ссылки imho), что 13 (байт 27) является размером следующего сегмента.

enter image description here

ответ

1

Это по-видимому, один байт, задающее длину следующих segment_table данных. Таким образом, есть 13 (шестнадцатеричных) байтов (16 десятичных) байтов данных segment_table.

+0

Ваш ответ основан на чтении спецификации? Поскольку спецификация говорит, что байт 26 должен быть '' page_segments "," Количество записей сегмента, которые будут отображаться в таблице сегментов. [...] "'. Так почему же это теперь байт 27? – user2366975

+0

Да, я прочитал спецификацию, которая не очень ясна. Я читал это, говоря, что этот байт - это длина. –

+0

Как? В нем говорится: «Байт 26: page_segments». Почему вы думаете, что это должен быть байт 27? Они начинают отсчет в 0. – user2366975

0

RFC 3533 - более подробное описание заголовка формата.

Байт 26 говорит, сколько байтов занимает таблица сегментов, поэтому вы читаете это, добавьте 27 и сообщите, где начинается первый (или продолжается) первый пакет.

Таблица сегментов сообщает длину (точки) инкапсулированного пакета (ов). В основном вы читаете таблицу, добавляя значения в каждый последующий байт. Если только что добавленное значение равно < 255, то это отметит границу пакета, поэтому запишите текущее значение аккумулятора, сбросьте его до нуля, а затем продолжайте, пока не дойдете до конца таблицы.

В вашем примере размер таблицы сегментов в байте 26 равен 1, поэтому данные начинаются с 27 + 1 или байт 28, что является началом строки «OpusHead». Значение в таблице 1-байтового сегмента равно 0x13, поэтому пакет имеет длину 19 байт. 28 + 19 - 47 (или 0x2f), который является началом схемы захвата «OggS» в начале следующего заголовка.

Этот слегка сложный алгоритм предназначен для хранения данных кадрирования для множества небольших пакетов с ограниченными накладными расходами, при этом допускающих произвольно большие пакеты. Также обратите внимание, что пакеты могут быть продолжены между страницами, охватывая 2 или более сегментных таблиц.

Смежные вопросы