Frankinshtein
> кто-нибудь работал с std_vorbis? апи там отличается сильно?
Отличается от чего? Какая разница, какое API, если всё делается за пару секунд? Инициализировал, открыл файл, и читаешь сколько надо семплов. Можно все, а можно понемногу по мере воспроизведения. В libvorbis суть та же.
Подскажите пожалуйста, а как собственно организовать проигрывание файла *.ogg
пытаюсь использовать stb_vorbis
1) Открыл файл библиотекой
2) Разместил в памяти
3) декодировать типа можно в файл или в память.
А в какую "мясорубку" весь этот массив запихать чтобы звуки пошли из колонок ? :)
как проигрывать-то ?
bykabak
> А в какую "мясорубку" весь этот массив запихать чтобы звуки пошли из колонок ? :)
> как проигрывать-то ?
Использовать DirectSound, OpenAL, XAudio или ещё что-то. Там надо создать буфер, запихнув туда полученные от библиотеки семплы и его уже воспроизводить.
т.е. полученный, после декодировки, буфер = wav в памяти компьютера ?
там как-то кусками декодирует. Пример кода есть у кого-нибудь ?
bykabak
> т.е. полученный, после декодировки, буфер = wav в памяти компьютера ?
Можно и так сказать, только без заголовка.
bykabak
> там как-то кусками декодирует.
Там есть функция, которая даёт столько семплов, сколько надо. Передаёшь ей полное количество семплов и она декодирует весь файл.
bykabak
> Пример кода есть у кого-нибудь ?
У меня всё разбросано по куче файлов, поэтому целого примера нет. В общем алгоритм такой:
1) Открываешь файл stb_vorbis_open_file
2) stb_vorbis_get_info возвратит тебе структурку с тем, какая у тебя частота дискретизации (обычно 44100) и сколько каналов (1 - моно, 2 - стерео и т.п.).
3) stb_vorbis_stream_length_in_samples даёт полное число семплов
4) stb_vorbis_get_samples_short_interleaved даёт сами семплы. Туда надо передать массив, который их вместит и полное количество short'ов - число семплов, умноженное на число каналов.
5) Семплы пихаешь в буфер и воспроизводишь. Это зависит от того, чем ты выводишь звук.
По сути после п. 4 задача сводится к воспроизведению WAV, уже прочитанного из файла в память. Так что можно брать любой пример воспроизведения WAV и делать аналогично.
gammaker,
cпасибо.
заработало. :)
Библиотечку нужно доработать до ума. Там косяки при проигрывании из памяти. Проигрывание из файла заработало. Речь веду про эту библиотечку.
bykabak
> Библиотечку нужно доработать до ума. Там косяки при проигрывании из памяти.
> Проигрывание из файла заработало. Речь веду про эту библиотечку.
Не знаю, я всегда проигрывал из памяти и никаких проблем не замечал. Правда тогда была более старая версия, может что напортили.
Как проанализировать до загрузки файла :
1) что он не *.ogg или "битый" ?
2) сколько памяти нужно для хранения всего декодированного массива из конкретного файла без загрузки файла в память ?
3) приходится загружать файл в память чтобы проанализировать всё что выше написал, и потом ещё раз загружать его же потому, что не работает функция ниже:
4) не работает функция
stb_vorbis_decode_memory(const unsigned char *mem, int len, int *channels, int *sample_rate, short **output);
потому что, если вы пройдёте по коду в отладчике, вы увидете, что там не выделяется память для буфера и один из внутренних вызовов
stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL);
всегда возвращает ошибку из-за того что последним параметром стоит NULL.
bykabak
> Как проанализировать до загрузки файла :
Что значит "до загрузки файла"? До полного декодирования? Если ничего не декодировать, то stb_vorbis сами данные читать не будет, только заголовок проанализирует и подготовится к декодированию.
> 1) что он не *.ogg или "битый" ?
Прочитать первые четыре байта из файла. Если это не "OggS", значит файл не ogg. Битость может быть в любом месте файла и от неё никак не застрахуешься. std_vorbis вроде не особо пытается обнаружить битость файла, так что может наверное даже упасть. Можно на всякий случай проверить заголовок, что он содержит правильные значения, но наверное это-то std_vorbis сам проверит.
bykabak
> 2) сколько памяти нужно для хранения всего декодированного массива из
> конкретного файла без загрузки файла в память ?
Функция stb_vorbis_stream_length_in_samples даст полное число семплов. Умножаешь это число на количество каналов. Это и есть количество short'ов, которое надо выделить для хранения всего массива.
bykabak
> всегда возвращает ошибку из-за того что последним параметром стоит NULL.
Не должно, это необязательный параметр. Это пользователь при желании может передать свой буфер для внутренних дел библиотеки, но не обязан.
А вообще stb_vorbis_decode_memory для слабаков, используй open_memory, получай информацию о файле и загружай вручную.
Я поэтому и прошу пример кода :) Ладно, в разных файлах, значит в разных файлах. и на том спасибо ;)
Главное что заработал декодер. Дальше проще.
Ну почему такая не справедливость Jpeg алгоритм проще некуда, а в Mp3 засада.
Тема в архиве.