我正在尝试在我的 java 应用程序中播放 mp3。用户可以单击按钮并更改声音。
声音和切换工作......但是,当用户尝试切换声音时,新歌开始在旧歌上播放大约一秒钟,然后旧歌停止播放。我正在尝试使用线程来处理所有事情。
我的 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 秒的延迟。所以也许在某个地方等待?
谢谢!
编辑: 我现在使用基于这里的代码:
我创建了一个播放和关闭函数,定义如下:
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();
我的问题是关闭函数……播放器对象始终为空,关闭函数不执行……即使播放函数对其进行了初始化。为什么它是空的?