UnsupportedAudioFileException的解决方法?

我正处于用Java编写小型音乐/节奏游戏的早期阶段(通过Slick框架,它依次使用OpenAL,但这可能与此无关)。 游戏需要以WAV格式读取(和播放)几个声音文件,但有些文件会抛出[javax.sound.sampled.UnsupportedAudioFileException]exception。

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.(Sound.java:33) 

这些文件可以在Winamp或Foobar2000中播放得很好,所以这意味着Java只是不识别文件格式的某些变体。 此时我有什么选择?

注意:有问题的文件是用户提供的,所以我不能事先转换它们(使用像audacity这样的东西)。 任何转换步骤都必须在运行时完成。

有关WAV文件需要认识的一点是,它是一种容器格式 – 它可以保存多种不同格式的数据,包括未压缩的PCM到MP3 。

在这种情况下,我猜测正在使用的库是挂钩到Java Sound API ,并且API的实现不支持WAV文件中包含的数据格式,从而导致UnsupportedAudioFileExceptionexception。

这些文件可以在Winamp或Foobar2000中播放得很好,所以这意味着Java只是不识别文件格式的某些变体。

Winamp和其他程序可以播放WAV文件的原因是因为它可能使用Windows Audio Compression Manager或(如果我理解的话) DirectShow ,它用于管理不同类型的音频编解码器 。

Winamp本身不需要知道如何解码WAV文件中的音频数据; 它要求ACM或DirectShow返回它可以处理的原始音频数据。 (或者也可能,数据直接发送到音频输出。)

此时我有什么选择?

一种替代方案似乎以Java Media Framework的forms存在,它似乎支持许多多媒体格式 。

它表示在使用“JMF 2.1.1 Windows性能包”时会挂钩到Windows ACM,因此它可能能够播放Java Sound API无法播放的WAV文件。