[英]Working with AudioPlayer in Java
在我的 swing 應用程序中,我使用 class 在單擊鼠標時播放聲音。 我遇到的問題是,當我調用 class 時,會播放一次聲音,而當突然單擊另一個按鈕時,它不會播放聲音。 我嘗試在我的代碼中給出延遲,但仍然 id 沒有按我預期的那樣工作。 跟線程有關系嗎?? 我不擅長線程,所以請告訴我該怎么做。 我正在使用的代碼如下,
package utilities;
import java.applet.AudioClip;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
public class Tone {`
File wavFile = new File("sounds/Windows Default.wav");
URL urlClick = Tone.class.getResource("/sounds/WindowsDefault.wav");
AudioClip sound;
public void sound() {
AudioStream as = null;
try {
InputStream in = this.getClass().getResourceAsStream("/sounds/WindowsDefault.wav");
as = new AudioStream(in);
AudioData data = as.getData();
// Create ContinuousAudioDataStream.
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);
//System.out.println(as.getLength());
AudioPlayer.player.start(cas);
//System.out.println(urlClick);
//sound = Applet.newAudioClip(urlClick);
//this.wait(1000);
for(int i =0;i<100000;i++){
double k = Math.pow(i, 5);
if(i==99999){
AudioPlayer.player.stop(cas);
return;
}
}
// sound.play();
String relativeDirectory = System.getProperty("user.dir");
System.out.println(relativeDirectory);
} catch (IOException ex) {
Logger.getLogger(Tone.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
as.close();
} catch (IOException ex) {
Logger.getLogger(Tone.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public static void main(String[] args) {
Tone tone = new Tone();
tone.sound();
System.out.println("done");
}
}
--EDIT-- 我使用連續音頻流的原因是因為當我使用它時聲音根本沒有發生,至少聽到一些聲音。 即使當我使用 AudioStream 時,問題仍然存在..
1) 最好不要使用隱藏的類/api - 正如您已經在其他問題中獲得的鏈接中閱讀過的那樣:-)
2)在公共 api 再次啟動/重新打開之前停止/關閉已經運行的聲音,例如:
Clip clip;
private void doPlay(final String url) {
try {
stopPlay();
AudioInputStream inputStream = AudioSystem
.getAudioInputStream(getClass().getResourceAsStream(url));
clip = AudioSystem.getClip();
clip.open(inputStream);
clip.start();
} catch (Exception e) {
stopPlay();
System.err.println(e.getMessage());
}
}
private void stopPlay() {
if (clip != null) {
clip.stop();
clip.close();
clip = null;
}
}
(注意:完全關閉僅用於說明,細化邏輯加載一次然后停止/重新啟動)
看起來 ContinuousAudioDataStream 僅在到達文件末尾后才重置,因此可能是在此之前發生了第二次按鈕單擊。 也許嘗試重置 stream
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.