所以,我正在为我的计算机科学课做一个游戏,最近我遇到了一个问题:当mp3文件播放完毕后,标题画面上播放的音乐停止了。我有一个MP3课程和一个音乐课程,但我不知道如何在歌曲完成后再次播放MP3。这是我的MP3课程:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
public class MP3
{
String filename;
Player player;
public void stopMP3() { if (player != null) player.close(); }
// play the MP3 file to the sound card
public void playMP3(String filename) {
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();
}
}
这是我的音乐课程:
import java.io.*;
import javazoom.jl.player.Player;
import java.util.Random;
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.util.*;
public class Music
{
private ArrayList<String> songs;
public Music(ArrayList<String> list)
{
songs = new ArrayList<String>();
for(int i = 0; i < list.size(); i++)
{
songs.add(list.get(i));
}
}
public String getRandSong()
{
Random r = new Random();
int randSongIndex = r.nextInt(songs.size());
return songs.get(randSongIndex);
}
}
我正在考虑在我的音乐课上制作一种方法,但我不知道如何检查MP3是否完成。顺便说一句,我只用了一年不到一年的Java编程,所以如果你对我的代码有任何其他的建议,我很乐意接受它们。此外,整个程序旨在在计算机上运行,而不是任何手持设备,如果这有任何区别的话。
答案 0 :(得分:2)
如何使用mp3agic库获取mp3文件的属性。
这个库有一个名为Mp3File的类,在类中定义了一个方法,以秒为单位获取文件的长度。
Mp3File file = new Mp3File(songAbsolutePath);
long mp3LengthInSeconds = file.getLengthInSeconds();
一旦你在几秒钟内得到长度,你就可以决定歌曲是否完成。
一旦开始播放,另一个线程可以休眠指定的秒数,然后再次调用mP3文件。
这个库还有许多其他函数可以读取ID3v1,ID3v2和mp3文件的其他标签,并为您提供正确的输出。
答案 1 :(得分:0)
如果你想一遍又一遍地重复播放mp3文件,可以放while
循环:
new Thread() { public void run() { try { while(true) { player.play(); } } catch (Exception e) {System.out.println(e); } } }.start();
当上一个Player#play
方法结束时,while
循环将重复,并且将对Player#play
进行第二次调用。
答案 2 :(得分:0)
对@Willem有类似的解决方案。但是添加更多细节。如果你让你的玩家在无限循环中玩,你需要停止一段时间。因此,检查静态布尔变量以停止播放。这只是一个开始。您可以添加更多控件。
package audio;
public class InfiniteLoop {
public static void main(String ar[]) throws InterruptedException {
// run in new thread to play in background
Play p1 = new Play(1);
Thread t1 = new Thread(p1);
t1.start();
// Let it play for 10 seconds. Then stop.
System.out.println("Thread is playing in background");
Thread.sleep(10000);
// Stop it.
p1.setStop(true);
}
}
class Play implements Runnable {
boolean stopped = false;
int id;
Play(int id) {
this.id = id;
}
public void setStop(boolean b) {
this.stopped = b;
}
public void run() {
try {
while (!stopped) {
// This is a sample code. Add your player code here.
Thread.sleep(1000);
System.out.println(id + " " + "playing");
}
} catch (Exception e) {
System.out.println(e);
}
}
}
答案 3 :(得分:0)
我会使用AdvancedPlayer代替播放器。然后你可以设置一个在播放完成时会收到通知的监听器:
AdvancedPlayer player;
// ...
player = new AdvancedPlayer(bis);
player.setPlayBackListener(new PlaybackListener() {
@Override
public void playbackStarted(PlaybackEvent event) { }
@Override
public void playbackFinished(PlaybackEvent event) {
playMP3(filename);
}
});