【问题标题】:Playing a mp3 in java在java中播放mp3
【发布时间】:2015-01-10 04:07:18
【问题描述】:

我正在开发一个涉及播放 mp3 文件的 Java 项目。我希望我的应用程序从项目中播放文件,因此我将音乐文件存储在一个名为 music 的文件夹中,该文件夹位于名为 resources 的源文件夹中。这是我现在拥有的代码,但是当我运行它时,我得到一个 Bitstream 错误代码 102。我似乎无法弄清楚出了什么问题,有什么帮助吗?我正在使用 javazoom 库 (javazoom.jl.player.Player)

public void play() {
    try {
        InputStream stream = MP3.class.getClassLoader()
                .getResourceAsStream("/music/LoveStory.mp3");
        BufferedInputStream bis = new BufferedInputStream(stream);
        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();

}

【问题讨论】:

    标签: java mp3 media-player


    【解决方案1】:

    在设置播放器之前尝试关闭BufferedInputStream

    bis.close();
    

    我发现了类似的问题here

    【讨论】:

    • 谢谢,这似乎有所作为,但仍然不太正确。现在一个声音开始了(不完全像嗡嗡声,而是轻微的嗡嗡声),好像歌曲即将播放但它仍然没有播放。我仍然得到相同的错误代码 102
    • 你用的是linux还是mac哪个操作系统?我问的原因是因为音乐文件夹是根据你的根目录中的路径。这是放置音乐文件夹的一个非常奇怪的地方。你的意思是它在那里?
    • 你的意思是“/music/LoveStory.mp3”是文件名吗?
    • 我使用的是 Mac。我有一个名为资源的源文件夹,我的音乐文件夹位于此资源文件夹中。并回答文件名部分抱歉,这只是我忘了删除的旧部分!
    • 没问题。我刚刚看到其他内容说该错误也可能是由文件路径引起的,所以我想我问。您是否也尝试在将 InputStream 放入 BufferedInputStream 之前将其关闭?
    【解决方案2】:

    我居然发现了我的问题,这么小的事情我很尴尬!事实证明,当我删除路径名前面的前导“/”时,我的代码运行良好。我相信这与绝对路径与相对路径有关。

    【讨论】:

      【解决方案3】:

      使用 JavaFX 环境:

      package be.saleconix;
      
      import java.net.URL;
      
      import com.sun.javafx.application.PlatformImpl;
      import javafx.scene.media.Media;
      import javafx.scene.media.MediaPlayer;
      import javafx.util.Duration;
      
      class AudioPlayer implements Runnable {
          private URL resource;
          private Media media;
          private MediaPlayer mediaPlayer;
          private boolean ready = false;
          private Thread t;
          private String threadname;
          private static Integer numberOfActiveThreads = 0;
      
          /**
           * Start a mediaplayer thread
           * @param filename
           * @param threadname
           * @throws NullPointerException
           * @throws InterruptedException
           */
          public AudioPlayer(String filename, String threadname) throws NullPointerException, InterruptedException {
              if (numberOfActiveThreads == 0) {
                  PlatformImpl.startup(()->{}); // initialize JavaFX environment
                  System.out.println("The JavaFX environment has been started");
              }
              this.threadname = threadname;
              resource = getClass().getResource("/" + filename);
              media = new Media(resource.toString());
              t = new Thread(this, threadname);
              t.start();
              numberOfActiveThreads ++;
          }
      
          public void run() {
              mediaPlayer = new MediaPlayer(media);
              mediaPlayer.setOnReady(() -> { // register a callback and let it deregister itself after execution
                  System.out.println("The mediaplayer [" + threadname + "] has been started");
                  ready = true;
                  mediaPlayer.setOnReady(null);
              });
              while (!t.isInterrupted());
              System.out.println("The mediaplayer [" + threadname + "] has been terminated");
          }
      
          String getThreadname() {
              return threadname;
          }
      
          /**
           * Plays the sound from the start
           * @throws InterruptedException
           */
          void play() throws InterruptedException {
              play(0);
          }
      
          /**
           * Plays the sound at a specific position in ms
           * @throws InterruptedException
           * @throws IllegalThreadStateException
           */
          void play(double position) throws InterruptedException, IllegalThreadStateException {
              int i = 500;
              while (!ready && i > 0) {
                  Thread.sleep(1);
                  i--;
              }
              if (i > 0) {
                  mediaPlayer.setStartTime(Duration.millis(position));
                  if (mediaPlayer.getStatus() == MediaPlayer.Status.PLAYING) {
                      mediaPlayer.setOnStopped(()->{
                          mediaPlayer.play();
                          mediaPlayer.setOnStopped(null);
                      });
                      mediaPlayer.stop();
                  } else {
                      mediaPlayer.play();
                  }
              } else {
                  throw new IllegalThreadStateException("The mediaplayer is not ready after 500ms timeout");
              }
          }
      
          /**
           * Stop the mediaplayer thread
           */
          void stop() {
              mediaPlayer.setOnReady(null);
              mediaPlayer.setOnStopped(null);
              mediaPlayer.stop();
              numberOfActiveThreads --;
              t.interrupt();
              if (numberOfActiveThreads == 0) {
                  PlatformImpl.exit(); // exit the JavaFX environment
                  System.out.println("The JavaFX environment has been exited");
              }
          }
      
      }
      
      public class Main {
          public static void main(String[] args) {
              try {
                  AudioPlayer audioPlayerA = new AudioPlayer("test.mp3", "audioplayerA");
      
                  System.out.println("Play audioplayerA from start");
                  audioPlayerA.play();
      
                  System.out.println("Waiting 10s ...");
                  Thread.sleep(10000);
      
                  System.out.println("Play audioplayerA at position 20s");
                  audioPlayerA.play(20000);
      
                  System.out.println("Waiting 5s ...");
                  Thread.sleep(5000);
      
                  AudioPlayer audioPlayerB = new AudioPlayer("test1.mp3", "audioplayerB");
      
                  System.out.println("Play audioplayerB from start.");
                  audioPlayerB.play();
      
                  System.out.println("Waiting 20s ...");
                  Thread.sleep(20000);
      
                  System.out.println("Stopping audioplayerA");
                  audioPlayerA.stop();
      
                  System.out.println("Stopping audioplayerB");
                  audioPlayerB.stop();
      
              } catch (NullPointerException e) {
                  System.out.println("Cannot create audio player, check filename.");
              } catch (InterruptedException e) {
                  System.out.println("Thread interrupted: " + e);
              } finally {
                  System.out.println("Main thread has been exited");
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多