В компьютерной игре, которую я делаю, я, очевидно, хочу включить звук. До сих пор я использовал AudioClip для воспроизведения файлов WAV. Хотя этот подход работает нормально, файлы WAV, как правило, огромны. Несколько секунд звука в итоге составляют сотни килобайт. Я столкнулся с тем, что при загрузке игры 95% аудио!
Очевидным вариантом здесь было бы использовать MP3 или Ogg Vorbis. Но у меня был ограниченный успех - я могу воспроизводить MP3 с помощью JLayer (но он воспроизводится в том же потоке). Что касается Огга, мне совсем не повезло. Хуже того, юридический статус JLayer несколько сомнительный.
Итак, мой вопрос как к Java-разработчикам, так и к людям, которые действительно кое-что знают о звуке: что мне делать? Могу ли я как-нибудь "обрезать жир" с моих WAV-файлов? Есть ли способ поиграть в Ogg на Java? Есть ли другой звуковой формат, который мне следует использовать вместо этого?




Они могут быть устаревшими, но они официально признаны командой Xiph.org (которая, среди прочего, поддерживает Ogg и Vorbis). http://www.vorbis.com/software/#java
Описанная вами проблема решается с помощью интерфейса поставщика услуг (SPI) для звука в Java. В результате простое добавление файлов JAR в путь к классам добавит функциональности стандартному Java Sound API. Это позволяет обрабатывать больше звуковых форматов без изменения кода.
В прошлый раз, когда я попробовал это, люди Javazoom предложили рабочий MP3 SPI JAR. Это было основано на упомянутом вами JLayer.
Для Vorbis OGG теперь, похоже, также есть библиотека SPI. Ознакомьтесь с документацией по Vorbis SPI на Javazoom.
Если вы решите остаться с форматом wav ...
Иметь качественные звуковые файлы, наверное, не очень важно. Вы можете использовать свой любимый редактор WAV, чтобы снизить битрейт, переключиться на моно или и то, и другое. Это сэкономит массу места, и вы не заметите разницы в качестве во время игры.
Надеюсь это поможет.
Вы можете использовать библиотеку JOrbis для воспроизведения музыки OGG. Для использования рабочего образца вы можете посмотреть эти файлы здесь.
Я также экспериментировал с некоторым сжатием звука без потерь, например, у меня был 16-битный монофонический звук. Я разделил верхний и нижний байты каждого сэмпла и поместил их друг за другом. Затем я применил дифференциальную замену, при которой каждый байт заменяется его отличием от последнего байта. И, наконец, использовал GZIP для сжатия данных. Мне удалось уменьшить размер данных до 50-60% от исходного. К сожалению, этого оказалось недостаточно, поэтому я обратился к формату OGG.
Одна вещь, которую я заметил с 8-битной музыкой, заключается в том, что если я изменяю громкость звука, воспроизведение становится очень шумным. Я решил эту проблему, повысив дискретизацию аудиоданных до 16 бит прямо перед SourceDataLine.write ().
Я собрал JOrbis, VorbisSPI и Tritonus-Share в одной библиотеке, поэтому вы можете использовать Java Sound API (AudioSystem) для декодирования файлов Java. связь
Блестяще! Ранее я смотрел на JOrbis, но его кажущееся полное отсутствие документации не позволило мне понять, как на самом деле указать его на файл .ogg и заставить звук исходить из динамика.