私は自分のJavaアプリケーションでmp3を再生しようとしています。ユーザーはボタンをクリックしてサウンドを変更することができます。Javaスレッドが遅延で終了する
サウンドと切り替えの作業...しかし、ユーザーがサウンドを切り替えようとすると、古い曲が再生を停止する前に、新しい曲が古いものより約1秒間再生されます。私はすべてを処理するスレッドを使用しようとしています。
マイ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();
誰かがそれを変更しようとすると、次のコードが実行される:tは、ファイル名のパラメータである
song.stop();
song = new mp3(t+".mp3");
song.start();
を。
私はこの問題がMP3オブジェクトの実行機能に依存していると確信しています。私はスレッドに完全に新しいので、私はいくつかの助けに感謝します。
"stop"が呼び出されてから実際に再生が停止するまでの遅延時間は約1秒です。だからどこかで待っているかもしれない?
ありがとうございます!
EDIT:私は今ここでのオフに基づいてコードを使用しています:
を次のように私は演劇を作成しているし、近い関数が定義:
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();
私の問題はclose関数です...プレーヤーオブジェクトは常にnullで、close関数は実行されません。プレイ関数はそれを初期化しますが。なぜそれはnullですか?
'Thread.stop()'は廃止されたメソッドであり、使用しないでください。 – Gray
['Clip'](http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/Clip.html)や[' BigClip'](http: //stackoverflow.com/a/9470886/418556)。 –
スレッドを拡張するか、Runnableを実装します。両方を行う必要はありません。スレッドをシャットダウンするのは、サウンドをすぐに止める正しい方法ではないでしょう。 JavazoomのPlayerが提供するいくつかのメソッドがあるはずです。存在しなければ、それはそのオブジェクトの欠陥です。また、Playerの各インスタンスは、おそらく再利用を試みるのではなく、独自のスレッド内に存在する必要があります。 –