【问题标题】:Make an mp3 file play continuously让一个 mp3 文件连续播放
【发布时间】:2016-06-21 19:06:30
【问题描述】:

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

【问题讨论】:

    标签: java audio


    【解决方案1】:

    如何使用 mp3agic 库来获取 mp3 文件的属性。

    这个库有一个名为 Mp3File 的类,在该类中定义了一个方法来获取文件的长度(以秒为单位)。

    Mp3File file = new Mp3File(songAbsolutePath);
    long mp3LengthInSeconds = file.getLengthInSeconds();
    

    一旦你得到了以秒为单位的长度,你就可以决定歌曲是否完成。

    播放开始后,另一个线程可以休眠指定的秒数,然后再次调用 mP3 文件。

    这个库还有很多其他功能,可以读取 mp3 文件的 ID3v1、ID3v2 和其他标签并为您提供正确的输出。

    【讨论】:

    • 谢谢!这行得通,除了我不知道你让另一个线程休眠指定秒数是什么意思。我对此并不熟悉。你介意让我知道这意味着什么吗?
    • 很高兴知道它对您有所帮助。通过其他线程,我的意思是调用 MP3 类的“playMP3”函数然后它会休眠直到 mp3 继续播放的线程。播放和睡眠将具有相同的持续时间。所以一旦播放完成,线程将选择下一首随机歌曲,播放并再次休眠。像这样,(你的 MP3 类中的主要功能)
    • 类似这样的东西,(你的 MP3 类中的主要函数)看看这段代码,它使用你的 MP3 和音乐类http://ideone.com/UEhSbG
    【解决方案2】:

    如果你想一遍又一遍地重复mp3文件,你可以把while循环:

    新线程() { 公共无效运行(){ 尝试 { 而(真){ 播放器.play(); } } 捕获(异常 e){System.out.println(e); } } }。开始();

    当之前的Player#play 方法结束时,while 循环将重复并执行第二次对Player#play 的调用。

    【讨论】:

      【解决方案3】:

      与@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);
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        我会使用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);
            }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多