我正处于用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这样的东西)。任何转换步骤都必须在运行时完成。
答案 0 :(得分:5)
有关WAV
文件需要识别的一件事是,它是一种容器格式 - 它可以包含多种不同格式的数据,包括uncompressed PCM到MP3。
在这种情况下,我猜测正在使用的库正在挂钩Java Sound API,并且API的实现不支持{{1}中包含的数据的格式} file,导致UnsupportedAudioFileException
例外。
文件可以播放得很好 在Winamp或Foobar2000中,这意味着 Java只是不认识一些 文件格式的变体。
Winamp和其他程序可以播放WAV
文件的原因是因为它可能正在使用Windows Audio Compression Manager或(如果我理解正确)DirectShow,用于管理不同类型的audio codecs。
Winamp本身不需要知道如何解码WAV
文件中的音频数据;它要求ACM或DirectShow返回它可以处理的原始音频数据。 (或者也可能,数据直接发送到音频输出。)
此时我有哪些选择?
似乎以Java Media Framework的形式存在替代方案,其似乎有support many multimedia formats。
它表示在使用“JMF 2.1.1 Windows性能包”时它将挂钩到Windows ACM,因此它可能能够播放Java无法播放的WAV
文件Sound API。