【问题标题】:Workaround for UnsupportedAudioFileException?UnsupportedAudioFileException 的解决方法?
【发布时间】:2010-05-16 13:08:41
【问题描述】:

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

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

【问题讨论】:

    标签: java audio wav openal


    【解决方案1】:

    关于WAV 文件需要认识到的一点是,它是一种容器格式——它可以保存许多不同格式的数据,包括uncompressed PCMMP3

    在这种情况下,我猜测正在使用的库正在挂钩到Java Sound API,并且API的实现不支持WAV文件中包含的数据格式,导致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 Performance Pack”时会挂接到Windows ACM,因此它可能能够播放Java Sound API无法播放的WAV文件.

    【讨论】:

    • 感谢您的回答。似乎没有其他人添加到这个,所以我接受这个:)。不过有一点更新:Java Media Framework 显然已经过时/被遗弃,并且多年没有更新,所以这可能不是一个好主意。找到 2 个值得进一步研究的替代方案:FMJ (fmj-sf.net) 和 Xuggler (xuggle.com/xuggler)。
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多