我已经创建了一个音频剪辑(javax.sound.sampled.Clip
):音频片段偶尔使用下面的代码不玩
public Clip getClip() throws Exception {
AudioInputStream in = AudioSystem.getAudioInputStream(getClass().getResource("test.wav"));
Clip clip = AudioSystem.getClip();
clip.open(in);
return clip;
}
...
this.clip = getClip();
而且我反复触发the clip回放:
public void play() {
clip.stop();
clip.flush();
clip.setFramePosition(0);
clip.start();
}
我通过使用JFrame
并在每次按键时调用play()
进行测试(full test class here)。大多数情况下,无论按多快键,每按一次键都会播放声音。但有时候,如果快速连续按下按键,声音会跳过其中一个按键,而根本不会播放。这是在游戏中实现的,所以一致的声音播放相当重要。
研究这个问题给我带来了this question,这表明每关闭其播放结束的时间线,因为这样的:
clip.addLineListener(e -> {
if (e.getType() == LineEvent.Type.STOP) e.getLine().close();
});
但是,这只是第一次后停止播放所有在一起。
,我已经尝试过其他的东西:的.stop()
在play()
.drain()
- 各种组合,
.flush()
和。 - 使用的
java.applet.AudioClip
代替Clip
- 重新创建每个播放的剪辑对象(这每次只需导致延迟播放)
我测试过了几个电脑和这个问题似乎不那么在高端个人电脑上突出或至少不太引人注目。如果是这种情况,是否有任何事情可以改善低端系统的播放一致性?如果这里的实现是问题,那么实现这个的正确方法是什么?
很好的答案。我在我的答案中添加了一些注释(有一个迂回的方式来指定一个剪辑的缓冲区大小),并想邀请你也检查出AudioCue。 –