tsc*_*han 1 java audio openal wav
我正处于用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)
Run Code Online (Sandbox Code Playgroud)
这些文件可以在Winamp或Foobar2000中播放得很好,所以这意味着Java只是不识别文件格式的某些变体.此时我有什么选择?
注意:有问题的文件是用户提供的,所以我不能事先转换它们(使用像audacity这样的东西).任何转换步骤都必须在运行时完成.
关于WAV文件需要认识的一件事是,它是一种容器格式 - 它可以保存多种不同格式的数据,包括未压缩的PCM到MP3.
在这种情况下,我猜测正在使用的库是挂钩到Java Sound API,并且API的实现不支持WAV文件中包含的数据格式,从而导致UnsupportedAudioFileException异常.
这些文件可以在Winamp或Foobar2000中播放得很好,所以这意味着Java只是不识别文件格式的某些变体.
Winamp和其他程序可以播放WAV文件的原因是因为它可能使用Windows Audio Compression Manager或(如果我理解的话)DirectShow,它用于管理不同类型的音频编解码器.
Winamp本身不需要知道如何解码WAV文件中的音频数据; 它要求ACM或DirectShow返回它可以处理的原始音频数据.(或者也可能,数据直接发送到音频输出.)
此时我有什么选择?
一种替代方案似乎以Java Media Framework的形式存在,它似乎支持许多多媒体格式.
它表示在使用"JMF 2.1.1 Windows性能包"时会挂钩到Windows ACM,因此它可能能够播放WAVJava Sound API 无法播放的文件.