用java播放mp3

用java播放mp3,java,mp3,media-player,Java,Mp3,Media Player,我正在从事一个涉及播放mp3文件的Java项目。我希望我的应用程序播放项目中的文件,这样我就可以将音乐文件存储在名为“音乐”的文件夹中,该文件夹位于名为“资源”的源文件夹中。这是我现在拥有的代码,但当我运行它时,我得到一个位流错误代码102。我好像不知道怎么回事,有什么帮助吗?我正在使用javazoom库(javazoom.jl.player.player) 在设置播放机之前,请尝试关闭BufferedInputStream bis.close(); 我发现了一个类似的问题。我实际上发现了我的

我正在从事一个涉及播放mp3文件的Java项目。我希望我的应用程序播放项目中的文件,这样我就可以将音乐文件存储在名为“音乐”的文件夹中,该文件夹位于名为“资源”的源文件夹中。这是我现在拥有的代码,但当我运行它时,我得到一个位流错误代码102。我好像不知道怎么回事,有什么帮助吗?我正在使用javazoom库(javazoom.jl.player.player)


在设置播放机之前,请尝试关闭
BufferedInputStream

bis.close();

我发现了一个类似的问题。

我实际上发现了我的问题,这是一件很小的事情,我很尴尬!结果是,当我删除路径名前面的前导“/”时,我的代码运行良好。我相信这与绝对路径和相对路径有关

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

谢谢,这似乎有所不同,但仍然不完全正确。现在,一个声音开始了(不是像嗡嗡声,而是轻微的嗡嗡声),好像这首歌即将播放,但它仍然没有播放。我仍然得到相同的错误代码1020您使用的是linux还是mac操作系统?我之所以问这个问题,是因为音乐文件夹是根据根目录中的路径设置的。这是一个非常奇怪的地方放你的音乐文件夹。你的意思是在那里吗?你的意思是“/music/LoveStory.mp3”作为文件名吗?我用的是Mac。我有一个名为resources的源文件夹,我的音乐文件夹就在这个resources文件夹中。回答文件名部分抱歉,那只是cold的一个旧部分,我忘记删除了!没问题。我只是看到一些其他的东西说错误也可能是由文件路径引起的,所以我想我会问。在将InputStream放入BufferedInputStream之前,您是否也尝试过关闭InputStream?
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");
        }
    }
}