在Java游戏中播放小声音

在Java游戏中播放小声音,java,audio,mp3,ogg,Java,Audio,Mp3,Ogg,对于我正在制作的电脑游戏,我显然想玩声音游戏。到目前为止,我一直在使用音频剪辑播放WAV文件。虽然这种方法可以很好地工作,但是WAV文件往往是巨大的。几秒钟的声音最终达到数百kB。我面临着95%音频的游戏下载 这里最明显的选择是使用MP3或Ogg Vorbis。但我在这方面的成功有限——我可以使用JLayer播放MP3(但它使用相同的线程播放)。至于奥格,我一点运气都没有。更糟糕的是,JLayer的法律地位有点可疑 所以,我的问题是对Java开发人员和一般真正了解声音的人来说:我该怎么做?我可以

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

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


所以,我的问题是对Java开发人员和一般真正了解声音的人来说:我该怎么做?我可以用某种方式“修剪脂肪”我的波浪吗?有没有在Java中玩Ogg的方法?我是否应该使用其他声音格式?

这些格式可能已经过时,但它们已经被Xiph.org团队(维护Ogg和Vorbis等)正式认可。
您描述的问题由Java中声音的服务提供商接口(SPI)解决。结果是,只需将JAR文件添加到类路径中,就可以为默认的Java声音API添加功能。这样就可以在不改变代码的情况下处理更多的声音格式

上一次我尝试这个,人们提供了一个工作的MP3 SPI罐。这是基于你提到的JLayer


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

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

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

希望这对您有所帮助。

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

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


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

Brilliant!我以前看过JOrbis,但它似乎完全缺乏文档,这使我无法弄清楚如何实际将它指向.ogg文件并使扬声器发出声音。我将JOrbis、Vorbispi和Tritonus Share组装在一个库中,因此您可以使用Java Sound API(AudioSystem)解码Java文件。