2009-10-11 225 views
2

我想在Java中播放WAV聲音(一些自定義視頻格式的音頻曲目),但是,我無法使用Clip:一次似乎只有一個實例是可忍受的。因此,我切換到普通的舊的SourceDataLine方式。暫停SourceDataLine播放

在這種情況下,我想在視頻暫停和取消暫停時暫停和恢復音頻。不幸。當我請SDL停止()時,播放螺紋完全完成和聲音緩衝器被清空:

sdl.open(); 
sdl.start(); 
sdl.write(dataBuffer); 
sdl.drain(); 
sdl.stop(); 

發出異步停止(),同時音頻線程被阻塞上寫(),或漏()將實際上放鬆播放位置。

我該如何用阻塞的方式暫停SourceDataLine,以及/或者如何知道已經通過它播放了多少音頻來使用write(databuffer,skip,len)執行恢復操作?

回答

4

預期的方法是在SourceDataLine上調用stop()來暫停它,start()以恢復它。如果停止在音頻數據啓動時向SourceDataLine提供音頻數據,則會導致緩衝區溢出,這通常被認爲是錯誤狀況。只有在數據處於停止狀態時才停止送入數據。

drain()最後應調用以確保所有數據都已經寫入到SourceDataLine中。不要稱它爲「暫停」功能!

您應該將小緩衝區寫入源數據行以更好地控制是正確的。一個好的大小相當於50ms緩衝區 - 使用open(AudioFormat, bufferSize)方法來指定緩衝區大小(以8800字節爲單位,44100Hz,16位立體聲)。

另外我會說,使用剪輯是首選的解決方案。在Clip上使用start()和stop(),它不應該吞噬太多。大多數Java Sound實現在Clip的內部使用SourceDataLine,因此應該沒有功能差異。 Java Sound應該確保您可以一次播放多個Clip。