UnsupportedAudioFileException的解决方法?

时间:2010-05-16 13:08:41

标签: java audio wav openal

我正处于用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这样的东西)。任何转换步骤都必须在运行时完成。

1 个答案:

答案 0 :(得分:5)

有关WAV文件需要识别的一件事是,它是一种容器格式 - 它可以包含多种不同格式的数据,包括uncompressed PCMMP3

在这种情况下,我猜测正在使用的库正在挂钩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。