Java 使mp3文件连续播放
因此,我正在为我的计算机科学课制作一个游戏,最近我遇到了一个问题:当mp3文件播放完毕时,在标题屏幕上播放的音乐就会停止。我有一门MP3课和一门音乐课,但我不知道如何让MP3在歌曲完成后再次播放。这是我的MP3课程:Java 使mp3文件连续播放,java,audio,Java,Audio,因此,我正在为我的计算机科学课制作一个游戏,最近我遇到了一个问题:当mp3文件播放完毕时,在标题屏幕上播放的音乐就会停止。我有一门MP3课和一门音乐课,但我不知道如何让MP3在歌曲完成后再次播放。这是我的MP3课程: import java.io.BufferedInputStream; import java.io.FileInputStream; import javazoom.jl.player.Player; public class MP3 { String filename
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);
}
}
import java.io.*;
导入javazoom.jl.player.player;
导入java.util.Random;
导入java.util.Scanner;
导入java.io.FileNotFoundException;
导入java.util.*;
公共音乐课
{
私人雅乐歌曲;
公共音乐(ArrayList列表)
{
歌曲=新的ArrayList();
对于(int i=0;i
我想在我的音乐课上制定一个方法,但我不知道如何检查MP3是否完成。顺便说一下,我用Java编程才不到一年,所以如果您对我的代码有任何其他建议,我很乐意接受。此外,如果这有什么不同,整个程序将在计算机上运行,而不是在任何手持设备上运行。如果您想反复重复mp3文件,可以在
的同时将循环:
new Thread() {
public void run() {
try {
while(true) {
player.play();
}
}
catch (Exception e) {System.out.println(e); }
}
}.start();
新线程(){
公开募捐{
试一试{
while(true){
player.play();
}
}
catch(异常e){System.out.println(e);}
}
}.start();
当前面的方法结束时,将重复while
循环,并执行对播放器#play
的第二次调用。如果您想反复重复mp3文件,可以将while
循环:
new Thread() {
public void run() {
try {
while(true) {
player.play();
}
}
catch (Exception e) {System.out.println(e); }
}
}.start();
新线程(){
公开募捐{
试一试{
while(true){
player.play();
}
}
catch(异常e){System.out.println(e);}
}
}.start();
当前面的方法结束时,将重复while
循环,并执行对Player#play
的第二次调用。使用mp3agic库获取mp3文件的属性如何
该库有一个名为Mp3File的类,在该类中定义了一个方法以获取文件的长度(以秒为单位)
Mp3File file = new Mp3File(songAbsolutePath);
long mp3LengthInSeconds = file.getLengthInSeconds();
一旦你得到了以秒为单位的长度,你就可以决定这首歌是否完成了
播放开始后,另一个线程可以休眠指定的秒数,然后再次调用mP3文件
该库还有许多其他功能,可以读取mp3文件的ID3v1、ID3v2和其他标记,并为您提供正确的输出。使用mp3agic库获取mp3文件的属性如何
该库有一个名为Mp3File的类,在该类中定义了一个方法以获取文件的长度(以秒为单位)
Mp3File file = new Mp3File(songAbsolutePath);
long mp3LengthInSeconds = file.getLengthInSeconds();
一旦你得到了以秒为单位的长度,你就可以决定这首歌是否完成了
播放开始后,另一个线程可以休眠指定的秒数,然后再次调用mP3文件
这个库还有许多其他功能,可以读取ID3v1、ID3v2和mp3文件的其他标记,并为您提供正确的输出。有一个与@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);
}
}
}
对@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);
}
}
}
我将使用而不是播放器。然后,您可以设置一个监听器,当播放完成时将收到通知:
AdvancedPlayer player;
// ...
player = new AdvancedPlayer(bis);
player.setPlayBackListener(new PlaybackListener() {
@Override
public void playbackStarted(PlaybackEvent event) { }
@Override
public void playbackFinished(PlaybackEvent event) {
playMP3(filename);
}
});
我将使用而不是播放器。然后,您可以设置一个监听器,当播放完成时将收到通知:
AdvancedPlayer player;
// ...
player = new AdvancedPlayer(bis);
player.setPlayBackListener(new PlaybackListener() {
@Override
public void playbackStarted(PlaybackEvent event) { }
@Override
public void playbackFinished(PlaybackEvent event) {
playMP3(filename);
}
});
谢谢这是有效的,但我不知道让另一个线程睡眠指定秒是什么意思。我对此不熟悉。你介意让我知道它的意思吗?很高兴知道它帮助了你。至于其他线程,我指的是调用MP3类的“playm3”函数的线程,然后它将一直休眠到MP3继续播放。播放和睡眠的持续时间相同。因此,一旦播放完成,线程将选择下一首随机歌曲,播放并再次睡眠。类似这样的东西,(你的MP3类的主要功能)类似这样的东西,(你的MP3类的主要功能)看看这个代码,它使用你的MP3和音乐类谢谢!这是有效的,但我不知道让另一个线程睡眠指定秒是什么意思。我对此不熟悉。你介意让我知道它的意思吗?很高兴知道它帮助了你。至于其他线程,我指的是调用MP3类的“playm3”函数的线程,然后它将一直休眠到MP3继续播放。播放和睡眠的持续时间相同。因此,一旦播放完成,线程将选择下一首随机歌曲,播放并再次睡眠。类似这样的东西,(你的MP3类的主要功能)类似这样的东西,(你的MP3类的主要功能)看看这个代码,它使用你的MP3和音乐类