Обходной путь для UnsupportedAudioFileException?

Я нахожусь на очень ранней стадии написания небольшой музыкальной / ритм-игры на Java (через фреймворк Slick, который, в свою очередь, использует OpenAL, но это, вероятно, здесь не имеет значения). Игра должна прочитать (и воспроизвести) несколько звуковых файлов в формате WAV, но некоторые из файлов выбрасывают исключения [javax.sound.sampled.UnsupportedAudioFileException].

at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1102)
at org.newdawn.slick.openal.WaveData.create(WaveData.java:123)
at org.newdawn.slick.openal.SoundStore.getWAV(SoundStore.java:713)
at org.newdawn.slick.openal.SoundStore.getWAV(SoundStore.java:683)
at org.newdawn.slick.Sound.<init>(Sound.java:33)

Файлы можно нормально воспроизводить в Winamp или Foobar2000, так что это означает, что Java просто не распознает некоторые варианты формата файла. Какие у меня варианты на данный момент?

Примечание: файлы, о которых идет речь, предоставляются пользователем, поэтому я не могу просто преобразовать их заранее (используя что-то вроде Audacity). Любые шаги преобразования должны выполняться во время выполнения.


person tschan    schedule 16.05.2010    source источник


Ответы (1)


О файлах WAV необходимо знать одну вещь: это контейнерный формат - он может хранить данные во многих различных форматах, включая несжатый PCM в MP3.

В этом случае я собираюсь предположить, что используемая библиотека подключается к Java Sound API, а реализация API не поддерживает формат данных, содержащихся в файле WAV, что приводит к _ 3_ исключение.

Файлы можно нормально воспроизводить в Winamp или Foobar2000, так что это означает, что Java просто не распознает некоторые варианты формата файла.

Причина, по которой Winamp и другие программы могут воспроизводить файл WAV, заключается в том, что он, вероятно, использует диспетчер сжатия звука Windows или (если я правильно понимаю) DirectShow, который используется для управления различными типами аудиокодеки.

Самому Winamp не нужно знать, как декодировать аудиоданные внутри файла WAV; он просит ACM или DirectShow вернуть необработанные аудиоданные, с которыми он может обработать. (Или, возможно, данные напрямую отправляются на аудиовыход.)

Какие у меня варианты на данный момент?

Альтернатива, похоже, существует в виде Java Media Framework , который, похоже, поддерживает множество мультимедийных форматов .

В нем говорится, что он будет подключаться к Windows ACM при использовании «JMF 2.1.1 Windows Performance Pack», поэтому он может воспроизводить файлы WAV, которые не могут быть воспроизведены Java Sound API.

person coobird    schedule 16.05.2010