ПрограммированиеФорумЗвук

Есть ли бесплатный MP3 декодер для интеграции в игру ? (2 стр)

Страницы: 1 2
#15
20:32, 23 июня 2015

Frankinshtein
> кто-нибудь работал с std_vorbis? апи там отличается сильно?
Отличается от чего? Какая разница, какое API, если всё делается за пару секунд? Инициализировал, открыл файл, и читаешь сколько надо семплов. Можно все, а можно понемногу по мере воспроизведения. В libvorbis суть та же.

#16
11:18, 24 июня 2015

Подскажите пожалуйста, а как собственно организовать проигрывание файла *.ogg
пытаюсь использовать stb_vorbis
1) Открыл файл библиотекой
2) Разместил в памяти
3) декодировать типа можно в файл или в память.

А в какую "мясорубку" весь этот массив запихать чтобы звуки пошли из колонок ? :)

как проигрывать-то ?

#17
13:14, 24 июня 2015

bykabak
> А в какую "мясорубку" весь этот массив запихать чтобы звуки пошли из колонок ? :)
> как проигрывать-то ?
Использовать DirectSound, OpenAL, XAudio или ещё что-то. Там надо создать буфер, запихнув туда полученные от библиотеки семплы и его уже воспроизводить.

#18
13:18, 24 июня 2015

т.е. полученный, после декодировки, буфер =  wav в памяти компьютера ? 

там как-то кусками декодирует. Пример кода есть у кого-нибудь ?

#19
13:37, 24 июня 2015

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 и делать аналогично.

#20
0:02, 25 июня 2015

gammaker,
cпасибо.

заработало. :)

Библиотечку нужно доработать до ума.  Там косяки при проигрывании из памяти. Проигрывание из файла заработало. Речь веду про эту библиотечку.

#21
0:27, 25 июня 2015

bykabak
> Библиотечку нужно доработать до ума.  Там косяки при проигрывании из памяти.
> Проигрывание из файла заработало. Речь веду про эту библиотечку.
Не знаю, я всегда проигрывал из памяти и никаких проблем не замечал. Правда тогда была более старая версия, может что напортили.

#22
10:17, 25 июня 2015

Как проанализировать до загрузки файла :

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.

#23
14:25, 25 июня 2015

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, получай информацию о файле и загружай вручную.

#24
14:40, 25 июня 2015

Я поэтому и прошу пример кода :)  Ладно, в разных файлах, значит в разных файлах.  и на том спасибо ;)

Главное что заработал декодер. Дальше проще.

#25
16:05, 29 июня 2015

Ну почему такая не справедливость Jpeg алгоритм проще некуда, а в Mp3 засада.

Страницы: 1 2
ПрограммированиеФорумЗвук

Тема в архиве.