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

Список разделов Ogg Vorbis Тех-поддержка

Описание: Инструменты, кодеки, сопроводительная информация, алгоритмы, программирование.

Сообщение #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.
Исходники на текущий момент мало отличаются от примеров.
Аркос
Репутация: 0
С нами: 10 лет 10 месяцев

Сообщение #2 Зелёный » 26.05.2013, 17:46

1 - Если "расковырять" значит "разделить" - то вот;
2 - Я гуманитарий, поэтому не знаю.
Зелёный M
Аватара
Откуда: Великий Новгород
Репутация: 5
С нами: 17 лет 2 месяца

Сообщение #3 Аркос » 26.05.2013, 20:57

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

Судя по тишине, либо я спросил глупость, либо ... =)
Аркос
Репутация: 0
С нами: 10 лет 10 месяцев

Сообщение #4 Janik » 27.05.2013, 01:27

Наши спецы оставят и для вас свои рекомендации, но не так быстро, как хотелось бы. Все очень заняты и бывают здесь редко.
Janik M
Аватара
Откуда: Санкт-Петербург
Репутация: 43
С нами: 16 лет 9 месяцев

Сообщение #5 Зелёный » 27.05.2013, 13:11

Аркос:>> 1) Как программно расковырять ogg на отдельные дорожки?
Сплиттер я видел. И исходники у него на asm'е, я в нём ни в зуб ногой.
Значит, вопрос неверно поставлен.
Зелёный M
Аватара
Откуда: Великий Новгород
Репутация: 5
С нами: 17 лет 2 месяца

Сообщение #6 VEG » 27.05.2013, 16:35

Аркос:1) Как программно расковырять ogg на отдельные дорожки?
Смотрите структуру одного фрейма Ogg. Она достаточно проста и есть в официальной документации. У каждого потока есть stream id. В файле с несколькими треками в какой-то момент stream id у фреймов будет изменяться — это и есть начало нового трека. Также, на сколько я помню, там есть байт флагов, в котором один из флагов отражает, является ли данный фрейм первым фреймом в новом треке. Подробнее здесь. По коду не подскажу — не доводилось использовать стандартную библиотеку для работы с Ogg Vorbis.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #7 Аркос » 03.06.2013, 06:34

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


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

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

Сообщение #8 VEG » 03.06.2013, 18:29

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

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


Вернуться в Тех-поддержка



cron