1

我正处于使用 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 无法识别文件格式的某些变体。在这一点上我有什么选择?

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

4

1 回答 1

5

关于文件需要识别的一件事WAV是,它是一种容器格式——它可以保存许多不同格式的数据,包括未压缩的 PCMMP3

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

这些文件可以在 Winamp 或 Foobar2000 中正常播放,因此这意味着 Java 无法识别文件格式的某些变体。

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

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

在这一点上我有什么选择?

Java Media Framework的形式似乎确实存在替代方案,它似乎支持许多多媒体格式

它说它在使用“JMF 2.1.1 Windows Performance Pack”时会挂接到 Windows ACM,因此它可能能够播放WAVJava Sound API 无法播放的文件。

于 2010-05-16T13:27:43.027 回答