2012-03-24 240 views
1

我有一個jsp,通過GlassFish中的java類播放wav文件。我已經使用SourceDataline方法:聲音輸出緩衝區沖洗

start(); 
drain(); 
close(); 

wav文件播放正常。對於停止我使用:

stop(); 
flush(); 
close(); 

但播放繼續與輸出緩衝區內的其餘數據。我在www.oracle.com上查看了有關SourceDataline方法的文檔。據說flush()將丟棄SourceDataline對象內的數據,但不會丟棄輸出緩衝區內的數據。

現在我想從輸出緩衝區中清除數據,以便在下次啓動時不會有聲音重疊。 我在JavaScript上搜索也沒有幫助。

+0

只是好奇,JavaScript與此有什麼關係? – 2012-03-24 05:16:16

+0

*「我有一個播放wav文件的jsp」*在哪裏?在服務器上(它可以驅動系統操作員瘋狂)?在客戶端(它需要一個applet)? – 2012-03-24 10:35:37

回答

0

這主要是在黑暗中拍攝,但可以工作:爲TargetDataLine.read的文件說:

從數據行的輸入緩衝區讀取音頻數據。 (...)但是,如果在讀取請求的數量之前數據行已關閉,停止,排空或刷新,則此方法不再阻塞,但會返回到目前爲止讀取的字節數。

所以,也許你可以嘗試訪問使用(可能使用Mixer.getTargetLines)的TargetDataLine的(一個或多個),並嘗試過作用於他們(停止,刷新等)。但是,我不確定是否會有這樣的副作用(或者甚至可能)。

是否有關於您可以分享的問題的其他信息?您提到了jsp,GlassFish和JavaScript,所以我猜測您要麼使用Applet來播放文件,要麼只是使用Java混合服務器端,但發送由瀏覽器處理的結果文件。這是否正確?

+0

是的,我在Java中使用AudioInputStream類的方法,而不是Applet。我正在對服務器上的音頻進行採樣並將結果發送到客戶端瀏覽器。我會實施你的解決方案並讓你知道。非常感謝你。 – 2012-03-24 06:02:18