【问题标题】:Playing small sounds in Java game在 Java 游戏中播放小声音
【发布时间】:2010-09-19 15:38:40
【问题描述】:

对于我正在制作的电脑游戏,我显然想播放声音。到目前为止,我一直在使用 AudioClip 播放 WAV 文件。虽然这种方法效果很好,但 WAV 文件往往是巨大的。几秒钟的声音最终变成了数百 kB。我面临着下载 95% 音频的游戏!

这里明显的选择是使用 MP3 或 Ogg Vorbis。但我在这方面的成功有限——我可以使用 JLayer 播放 MP3(但它在同一个线程中播放)。至于Ogg,我一点运气都没有。更糟糕的是,JLayer 的法律地位有点可疑。

所以我的问题是针对 Java 开发人员和一般对声音有一定了解的人:我该怎么办?我能以某种方式从我的 WAV 中“减少脂肪”吗?有没有办法在 Java 中玩 Ogg?我应该使用其他声音格式吗?

【问题讨论】:

    标签: java audio mp3 ogg


    【解决方案1】:

    您可以使用JOrbis 库来播放OGG 音乐。对于工作示例用法,您可以查看这些文件here

    我还尝试了一些无损音频压缩,例如我有一个 16 位单声道声音。我将每个样本的高字节和低字节分开,并将它们放在一起。然后我应用了差异替换,其中每个字节都被其与最后一个字节的差异所替换。最后使用 GZIP 压缩数据。我能够将数据大小减少到原始大小的 50-60%。不幸的是,这还不够,所以我转向了 OGG 格式。

    我注意到 8 位音乐的一件事是,如果我改变音量,播放会变得非常嘈杂。我通过在 SourceDataLine.write() 之前将音频数据上采样到 16 位解决了这个问题。

    【讨论】:

    • 太棒了!我之前看过 JOrbis,但它似乎完全缺乏文档,这让我无法弄清楚如何将它实际指向 .ogg 文件并从扬声器中发出声音。
    • 我将 JOrbis、VorbisSPI 和 Tritonus-Share 组装在一个库中,因此您可以使用 Java Sound API (AudioSystem) 来解码 Java 文件。 link
    【解决方案2】:

    如果您决定继续使用 wav 格式...

    拥有高质量的声音文件可能不是很重要。您可以使用您最喜欢的 wav 编辑器来降低比特率,切换到单声道,或两者兼而有之。这将节省大量空间,并且您在玩游戏时不会注意到质量差异。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您描述的问题已由 Java 中声音的服务提供者接口 (SPI) 解决。结果是,只需将 JAR 文件添加到您的类路径中,就会为默认的 Java Sound API 添加功能。从而能够在不更改代码的情况下处理更多声音格式。

      上次我尝试这个时,Javazoom 的人提供了一个可以工作的 MP3 SPI JAR。这是基于你提到的JLayer。

      对于 Vorbis OGG,现在似乎还有一个 SPI 库。查看 Javazoom 上 Vorbis SPI 上的文档。

      【讨论】:

        【解决方案4】:

        这些可能已经过时,但已得到 Xiph.org 团队(维护 Ogg 和 Vorbis 等)的正式认可。 http://www.vorbis.com/software/#java

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-11
          • 1970-01-01
          • 2010-11-02
          相关资源
          最近更新 更多