Страница 1 из 1

Программирование(с++): раздельное чтение vorbis-"дорожек" из контейнера ogg

Сообщение #1Добавлено: 23.05.2013, 10:04
Аркос
Доброго времени суток, vorbis.ogg.ru-сообщество.
Сами мы не местные, зарегистрировались у вас сегодня.
(Почитываю, впрочем, вторую недельку на предмет полезной информации)

Далее будет многобукаф, кому лень - переходите сразу в конец сообщения.
Просьба тако же опустить объяснения чайнику (читай, мне), что он чайник =)

//----------------------------------------------------------------------------------
многобукаф {

Конечно, хотелось бы убедиться, что ogg актуален как контейнер для звука.
Равно как и vorbis для сжатия.
Но это лирика. А проза...
Для этого опишу примерную задачу.
Пишется звуковая часть "движка" для простой самодельной игрушки.
Для звука используется OpenAL.

Цель пока чисто учебная.
Т.е. учусь писать разный кросс-платформенный код, копаюсь немного в верхах WinAPI и пр. *nix.

Для хранения звука был выбран ogg, т.к. давненько я уже с ним знаком как пользователь,
и в общем-то он меня вполне радует.
Даже уже поплёвывать на mp3 (в т.ч. с их лицензиями и пр.) начал.

И вот, начал я копаться в том, что же есть ogg и как с ым работать.
Был безмерно обрадован тем простым фактом, что он ещё и не просто очередной формат кодировки/сжатия,
а вполне себе контейнер,
да не простой, а золотой! Поддаётся элементарному "copy /b ++="

Т.к. никаким (пере)кодированием не занимался, было открытием, что звук-то vorbis, а не ogg.
И пр. чайнические озарения, пока что мало что дающие.

И встал следующий вопрос:
}//endof многобукаф
//----------------------------------------------------------------------------------

1) Как программно расковырять ogg на отдельные дорожки?
// декодирование в PCM was copypasted из примеров, в т.ч. потоковое.
2) Что есть лаконичного по ogg/vorbis?
Потому что офф. мануалы либо громоздки, либо бедны на объяснения...

Язык - С++, среда - пока что VS2012 express.
Исходники на текущий момент мало отличаются от примеров.

Сообщение #2Добавлено: 26.05.2013, 17:46
Зелёный
1 - Если "расковырять" значит "разделить" - то вот;
2 - Я гуманитарий, поэтому не знаю.

Сообщение #3Добавлено: 26.05.2013, 20:57
Аркос
>> 1) Как программно расковырять ogg на отдельные дорожки?
Сплиттер я видел. И исходники у него на asm'е, я в нём ни в зуб ногой.

Судя по тишине, либо я спросил глупость, либо ... =)

Сообщение #4Добавлено: 27.05.2013, 01:27
Janik
Наши спецы оставят и для вас свои рекомендации, но не так быстро, как хотелось бы. Все очень заняты и бывают здесь редко.

Сообщение #5Добавлено: 27.05.2013, 13:11
Зелёный
Аркос:>> 1) Как программно расковырять ogg на отдельные дорожки?
Сплиттер я видел. И исходники у него на asm'е, я в нём ни в зуб ногой.
Значит, вопрос неверно поставлен.

Сообщение #6Добавлено: 27.05.2013, 16:35
VEG
Аркос:1) Как программно расковырять ogg на отдельные дорожки?
Смотрите структуру одного фрейма Ogg. Она достаточно проста и есть в официальной документации. У каждого потока есть stream id. В файле с несколькими треками в какой-то момент stream id у фреймов будет изменяться — это и есть начало нового трека. Также, на сколько я помню, там есть байт флагов, в котором один из флагов отражает, является ли данный фрейм первым фреймом в новом треке. Подробнее здесь. По коду не подскажу — не доводилось использовать стандартную библиотеку для работы с Ogg Vorbis.

Сообщение #7Добавлено: 03.06.2013, 06:34
Аркос
VEG:Она достаточно проста и есть в официальной документации. У каждого потока есть stream id.
То ли лыжи не едут, то ли пастью прощёлкал.
VEG:в какой-то момент stream id у фреймов будет изменяться — это и есть начало нового трека
Спасибо за наводку, буду копать.


В том же splitter+, помнится, применён какой-то хитрый приём...
Returned:- Увеличена в десятки раз скорость работы, за счёт вычисления размера страниц. В предыдущих версиях производился поиск страниц по-байтно
Кто-нибудь может подсказать, что сие значит и как это можно (нужно?) применить в C++?

//оффтоп: frame! так вот как принято называть то, что я обозначил "дорожкой" (track)
Благодарю за инфу и ссылку, как появятся вопросы - отпишусь.
Не буду зарекаться, но ежели осилю вопрос - выложу получившийся материал.

Сообщение #8Добавлено: 03.06.2013, 18:29
VEG
Аркос://оффтоп: frame! так вот как принято называть то, что я обозначил "дорожкой" (track)
Нет, frame — это не track. Один трек состоит из множества фреймов (страниц). В каждом фрейме закодировано несколько миллисекунд звукового потока.
Аркос:- Увеличена в десятки раз скорость работы, за счёт вычисления размера страниц. В предыдущих версиях производился поиск страниц по-байтно
Скорее всего в старых версиях фреймы искались по сигнатуре OggS, но это неправильно. Точный размер каждого фрейма вычисляется по данным из заголовка. Там есть небольшой индекс, какие порции данных хранит фрейм — суммируем их объёмы, добавляем размер заголовка фрейма — и получаем полный объём, занимаемый фреймом.

Добавлено спустя 1 минуту 44 секунды:
По-русски немного о заголовках фрейма (страницы, пакета — как только его не называют :) ) можно почитать даже в вики. Полное описание по-английски в RFC 3533.