使MP3文件连续播放

时间:2016-06-21 19:06:30

标签: java audio

所以,我正在为我的计算机科学课做一个游戏,最近我遇到了一个问题:当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编程,所以如果你对我的代码有任何其他的建议,我很乐意接受它们。此外,整个程序旨在在计算机上运行,​​而不是任何手持设备,如果这有任何区别的话。

4 个答案:

答案 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);
    }
});