我已經創建了一個音頻剪輯(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。 –