Java アプリケーションで mp3 を再生しようとしています。ユーザーは、ボタンをクリックしてサウンドを変更することができます。
サウンドと切り替えは機能します...ただし、ユーザーがサウンドを切り替えようとすると、古い曲の再生が停止する前に、古い曲の上に新しい曲が約 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();
誰かがそれを変更しようとすると、次のコードが実行されます。
song.stop();
song = new mp3(t+".mp3");
song.start();
ここで、t はファイル名のパラメーターです。
問題は MP3 オブジェクトの実行機能に依存していると確信しています。私はスレッドにまったく慣れていないので、助けていただければ幸いです。
繰り返しますが、「stop」が呼び出されてから実際に再生が停止するまでの遅延は約 1 秒です。それで、どこかで待っていませんか?
ありがとう!
編集: 私は今、ここに基づいたコードを使用しています:
次のように定義された play および close 関数を作成しました。
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();
私の問題はクローズ機能にあります...プレーヤーオブジェクトは常にnullであり、クローズ機能は実行されません...再生機能がそれを初期化しても。なぜヌルなのですか?