在Java游戏中播放小声音

10

为了制作我的电脑游戏,我需要播放声音。到目前为止,我一直使用AudioClip来播放WAV文件。虽然这种方法效果不错,但是WAV文件往往非常大。几秒钟的声音文件就会有数百kB大小。结果导致游戏下载的95%都是音频!

显而易见的选择是使用MP3或Ogg Vorbis格式。但是我在这方面取得了有限的成功——我可以使用JLayer播放MP3(但它在同一个线程中播放)。至于Ogg,则完全没有成功。更糟糕的是,JLayer的法律地位有些可疑。

因此,我的问题是针对Java开发人员和真正了解声音领域的人:我该怎么办?我能够从WAV中“削减肥肉”吗?有没有某种方式可以在Java中播放Ogg文件?还有其他我应该使用的声音格式吗?

4个回答

4
您可以使用JOrbis库播放OGG音乐。有关工作示例的使用,您可以在这里查看。
我还尝试了一些无损音频压缩,例如我有一个16位单声道声音。我分离了每个样本的上下字节,并将它们放在彼此之后。然后我应用了差分替换,其中每个字节都被其与上一个字节的差所替换。最后使用GZIP压缩数据。我能够将数据大小减小到原始大小的50-60%。不幸的是,这还不够,所以我转向了OGG格式。
我注意到8位音乐的一个问题是,如果我更改音频音量,则播放会变得非常嘈杂。我通过在SourceDataLine.write()之前将音频数据上采样为16位来解决了这个问题。

太好了!我之前看过JOrbis,但是它完全缺乏文档,使我无法弄清楚如何将其指向.ogg文件并使声音从扬声器中输出。 - Zarkonnen
我将JOrbis、VorbisSPI和Tritonus-Share组装成一个单一的库,因此您可以使用Java Sound API(AudioSystem)来解码Java文件。链接 - Trilarion

2

2
您所描述的问题可以通过Java中声音的服务提供程序接口(Service Provider Interface,SPI)来解决。结果就是简单地将JAR文件添加到类路径中即可为默认的Java声音API增加功能。因此,可以在不改变代码的情况下处理更多的声音格式。
上次我尝试时,Javazoom公司提供了一个可用的MP3 SPI JAR。它是基于您提到的JLayer构建的。
对于Vorbis OGG,现在也似乎有一个SPI库可用。请查看Javazoom上的Vorbis SPI文档。

2
如果您决定使用wav格式,可能并不需要非常高质量的声音文件。您可以使用喜欢的wav编辑器降低比特率、切换到单声道或两者兼而有之。这将节省大量空间,在游戏中播放时您不会注意到质量差异。希望这能帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接