Воспроизведение небольших звуков в Java-игре

Для компьютерной игры, которую я делаю, я, очевидно, хочу играть в звук. До сих пор я использовал AudioClip для воспроизведения WAV файлов. Хотя этот подход работает отлично, файлы WAV имеют тенденцию быть гигантскими. Несколько секунд звучания составляют сотни kB. Я столкнулся с тем, что у вас есть загрузка игры на 95% аудио!

Очевидным вариантом здесь будет использование MP3 или Ogg Vorbis. Но у меня был ограниченный успех - я могу играть в MP3 с помощью JLayer (но он играет в том же потоке). Что касается Огга, мне не повезло. Хуже того, юридический статус JLayer немного на сомнительной стороне.

Итак, мой вопрос касается как разработчиков Java, так и людей, которые действительно знают что-то о звуке: что мне делать? Могу ли я как-то "обрезать жир" с моих WAV? Есть ли способ играть в Ogg на Java? Есть ли другой формат звука, который я должен использовать вместо этого?

Ответ 1

Вы можете использовать JOrbis для воспроизведения музыки OGG. Для использования рабочего примера вы можете посмотреть эти файлы здесь.

Я также экспериментировал с некоторым сжатием без потерь, например, у меня был 16-битный монофонический звук. Я отделял верхний и нижний байты каждого образца и помещал их друг в друга. Затем я применил дифференциальную замену, в которой каждый байт заменяется его отличием от последнего байта. И, наконец, GZIP использовал для сжатия данных. Я смог уменьшить размер данных до 50-60% от исходного размера. К сожалению, этого было недостаточно, поэтому я обратился к формату OGG.

Одна вещь, которую я заметил с 8-битной музыкой, заключается в том, что если я изменяю громкость звука, воспроизведение становится очень шумным. Я решил эту проблему, повысив дискретизацию аудиоданных до 16 бит прямо перед SourceDataLine.write().

Ответ 2

Они могут быть устаревшими, но они официально признаны командой Xiph.org(которые поддерживают Ogg и Vorbis, среди прочих). http://www.vorbis.com/software/#java

Ответ 3

Описанная вами проблема адресуется интерфейсом поставщика услуг (SPI) для звука на Java. В результате простое добавление JAR файлов в ваш путь к классу добавит функциональность Java Sound API по умолчанию. Таким образом, возможность обработки более звуковых форматов без изменения кода.

В прошлый раз, когда я попробовал это, Javazoom люди предложили рабочий MP3 SPI JAR. Это было основано на упомянутом вами JLayer.

Для Vorbis OGG теперь также есть библиотека SPI. Просмотрите документы в Vorbis SPI на Javazoom.

Ответ 4

Если вы решили остаться с wav-форматом...

Вероятно, не очень важно иметь высококачественные звуковые файлы. Вы можете использовать свой любимый редактор wav, чтобы снизить скорость передачи данных, переключиться на моно или на оба. Это спасет тонны пространства, и вы не заметите разницу в качестве во время игры.

Надеюсь, что это поможет.