我正在开发一个程序,播放包含MP3的播放列表。
我正在使用以下MP3类
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.AudioInputStream;
import javazoom.jl.player.Player;
public class MP3 {
private Player player;
public BufferedInputStream bis;
// constructor
public MP3() {
}
public void close() throws IOException {
if (player != null)
player.close();
}
// play the MP3 file to the sound card
public void play(String filename) {
try {
InputStream stream = MP3.class.getClassLoader()
.getResourceAsStream(filename);
bis = new BufferedInputStream(stream);
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();
}
}
我已经能够根据此代码播放MP3文件但我无法播放多个文件。当我第一次尝试播放MP3的ArrayList时,所有的歌曲都在相互播放。然后我尝试使用.wait方法让第二首歌等到第一首歌完成播放。然而,这也奏效了,这也使我的节目中的所有内容都等到歌曲完成播放之后才能执行任何其他操作。我希望我的程序能够在播放歌曲时做多个事情,这样方法就不会起作用。
这是我目前使用的代码.wait
} else if (e.getSource() == btn2) {
ArrayList<Integer> songsToPlay = new ArrayList<Integer>();
songsToPlay.add(1);
songsToPlay.add(2);
if (b2 == false) {
b2 = true;
mp3 = new MP3();
//loop through the ArrayList of songs
for (int i = 0; i < songsToPlay.size(); i++) {
mp3.play("music/" + songsToPlay.get(i) + ".mp3");
synchronized (mp3) {
try {
mp3.wait(1000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
// e2.printStackTrace();
}
}
}
} else {
b2 = false;
try {
mp3.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
// e1.printStackTrace();
}
}
}
任何建议都会很棒,因为我已经坚持了一段时间。此外,如果我想找到一种方法使用.wait我还需要一种方法来计算当前MP3的长度。现在我只是硬编码的价值观。
答案 0 :(得分:0)
你有没有理由想手动完成这一切?例如,为什么不将java VLC库用作播放器?
关于这个话题,你似乎缺少一些有价值的信息来建立一个方便的玩家。当前曲目的长度是多少?用户如何通过歌曲寻找?你读过mp3文件的ID3标签来显示标题,艺术家,专辑等信息吗?
我知道这不是问题的直接答案,但它可能会帮助您自己找到它。