我想在我的Java應用程序中播放mp3。用戶有能力點擊按鈕並改變聲音。以延遲結束的Java線程
聲音和切換工作...但是當用戶試圖切換聲音時,新的歌曲開始在舊的播放器上播放約一秒鐘,然後在舊的播放器停止播放。我正在嘗試使用線程來處理一切。
我的MP3類:
import java.applet.*;
import javazoom.jl.player.Player;
import java.io.*;
import java.io.FileInputStream;
import java.net.*;
public class mp3 extends Thread implements Runnable{
private Player sound;
private InputStream path;
public mp3(String file_name) {
path = mp3.class.getClassLoader().getResourceAsStream(file_name);
}
public void run(){
try {
Player sound=new Player(path);
sound.play();
} catch(Exception e) {System.out.println(e);}
}
}
這就是我試圖在我的主遊戲運行代碼。 MP3對象被稱爲歌曲。
當應用程序初始化,下面的代碼運行:
song = new mp3("default.mp3");
song.start();
有人試圖去改變它,下面的代碼運行:
song.stop();
song = new mp3(t+".mp3");
song.start();
其中T是文件名的參數。
我很確定這個問題依賴於MP3對象的運行功能。我對線程完全陌生,所以我希望得到一些幫助。
同樣,從「停止」被調用的時間和實際停止播放的時間延遲約爲1秒。所以也許在那裏等一下?
謝謝!
編輯:我使用的代碼基於離這裏現在:
我創建了一個播放和定義關閉功能如下:
public void close() { if (player != null) player.close(); }
// play the MP3 file to the sound card
public void play() {
try {
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
player = new Player(bis);
} catch (Exception e) {
System.out.println("Problem playing file " + filename);
System.out.println(e);
}
// run in new thread to play in background
new Thread() {
public void run() {
try { player.play(); }
catch (Exception e) { System.out.println(e); }
}
}.start();
我的問題是關閉功能...播放器對象始終爲空,並且關閉功能不會執行..即使播放函數初始化它。爲什麼它是空的?
'Thread.stop()'是不推薦使用的方法,不應使用。 – Gray 2012-04-17 05:09:25
['Clip'](http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/Clip.html)或['BigClip'](http: //stackoverflow.com/a/9470886/418556)。 – 2012-04-17 08:33:46
可以擴展Thread或實現Runnable。沒有必要這樣做。關閉線程很可能不是立即停止聲音的正確方法。 Javazoom的播放器應該提供一些方法。如果沒有,那麼這是他們的對象的缺陷。另外,Player的每個實例可能都應該在自己的線程中,而不是試圖重用。 – 2012-04-18 04:41:53