Java 使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

因此,我正在为我的计算机科学课制作一个游戏,最近我遇到了一个问题:当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);
    }
}
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和音乐类