我想在我的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