缓存声音并创建其实例



我目前正在编写一个游戏,现在我也想添加声音。我目前的方法很好,但我对此不满意。

new Sound(new Resource().readAndGetStream("small_click.wav")).play();

每当执行文件small_click.wav时,这行代码都会读取该文件。但我认为在需要的时候总是读取资源文件并不是很有效。所以我现在想做的是将声音缓存在一个变量中,或者不必再次从文件中加载声音。但我也想从声音中创建一个新的对象,这样我就可以多次播放它,并且它在扬声器中重叠

我找不到做这件事的方法。我已经尝试过使用Threads,但是。。此代码在没有任何线程的情况下工作。

如果你想知道,这里是声音类的代码:

public Sound(InputStream audioSrc) {
try {
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);
clip = AudioSystem.getClip();
clip.open(audioStream);
} catch {
...exception handling...
}
}
public void play() {
clip.setFramePosition(0);
clip.start();
}

如果你想知道"new Resource((.readAndGetStream(("的作用:它基本上加载一个资源,并用getResourceAsStream()返回该资源的InputStream

使用您拥有的Sound类,您可以轻松创建"缓存"。例如,创建一个类型为Sound[] soundCache的数组,并执行您在示例中给出的代码行的第一部分。

soundCache[0] = new Sound(new Resource().readAndGetStream("small_click.wav"));

你甚至可以考虑使常数对应于每个声音。

final int SMALL_CLICK = 0;

然后,当该播放声音时,执行播放功能。

soundCache[SMALL_CLICK].play();

从这里到同时播放给定的声音要复杂得多。如果继续以Clip为基础进行工作,我不知道有什么方法可以获得相同声音资源的重叠回放,除非制作和管理尽可能多的Clip副本,以便一次听到。

当面临这个编码挑战时,我最终编写了自己的库AudioCue。它可以在Github上获得,并且有一个非常宽松的许可证。

基本概念是将音频数据存储在签名PCM浮点数组中,并通过具有多个"游标"来管理并发播放,这些"游标"可以独立地迭代PCM数据并将其馈送到SourceDataLine

这些游标可以实时管理。您可以更改它们在数据中传播的速率,并缩放数据的音量级别,从而允许频率和音量变化。

我尽我所能使API尽可能地与Clip相似,这样,熟悉Java的Clip的程序员就可以很容易地使用该类。

请随意检查代码中的想法/示例,或在您的项目中使用此库。

最新更新