【问题标题】:How to play MP3 files that are in the resources folder in a Jar file?如何播放 Jar 文件中资源文件夹中的 MP3 文件?
【发布时间】:2019-12-19 19:29:01
【问题描述】:

我正在尝试访问 jar 文件中资源文件夹内的 MP3 文件。我遇到了一些问题,无法阅读。

import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;

import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerException;

public class MP3 {

    private static final Logger logger = Logger.getLogger(Main.class.getName());


    private BasicPlayer player;


    /**
     * Constructor
     */
    public MP3() {
        player = new BasicPlayer();
    }

    public void changeSong(song) {

        // Change song now
        String pathToMp3 = System.getProperty("user.dir") + this.getClass().getResource(song);
        try {
            player.open(new URL("file:///" + pathToMp3));
            player.play();
            logger.info("Playing the song: " + song);
        } catch (MalformedURLException | BasicPlayerException e) {
            logger.info("Could not turn on MP3 music from: " + pathToMp3);
        }

    }

}

pathToMp3 如下所示:

我已经解决了 CSV 读取的类似问题。而不是从资源中读取。我将资源读取为流。

InputStream in = getClass().getResourceAsStream("/file.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

但这里的问题是

layer.open(new URL("file:///" + pathToMp3));

采用参数 URL,而不是流或字符串。你知道如何从可执行 JAR 文件中的资源文件夹流式传输 MP3:s 吗?

更新:

       // Change song now
        String pathToMp3 = getClass().getResource(song).toString();
        InputStream in = getClass().getResourceAsStream(song);
        try {
            player.open(in);
            player.play();
            logger.info("Playing the song: " + song);
        } catch (BasicPlayerException e) {
            logger.info("Could not turn on MP3 music from: " + pathToMp3);
        }

给出错误:

【问题讨论】:

  • 既然this.getClass().getResource(song); 返回一个URL,你考虑过试试player.open(this.getClass().getResource(song))吗?
  • 另外,检查song 值,为简单起见,确保它是从包结构顶部到资源的绝对路径,即/resources/HappyHappJoyJoy.mp3
  • @MadProgrammer 它给出了和以前一样的错误。
  • 另外,也许您应该尝试在 catch 块中打印堆栈跟踪。也许这可以更好地了解正在发生的事情! e.printStackTrace();
  • 请注意,这是在 Raspberry Pi 上。但是 Java 无处不在 ;)

标签: java jar stream mp3 executable-jar


【解决方案1】:

我从here复制了BasicPlayerTest的例子,并修改了播放方法以采用URL

然后从项目中运行主要作品并在 jar 中导出之后。

请注意,我在 src 文件夹中复制了 resources 文件夹。

public static void main(String[] args) {
    BasicPlayerTest test = new BasicPlayerTest();
    test.play(test.getClass().getResource("/resources/test.mp3")); 
}

我在日志中看到的网址是:
jar:file:/C:/Temp/mp3.jar!/resources/test.mp3

【讨论】:

  • 嗯。谢谢!我在我的 Ubuntu 电脑上试过了。有用!但不是在 Raspberry Pi 上。
  • 您可能会在raspberrypi stackexchange 上得到更好的答案。如果你把 mp3 放在罐子外面,它真的有效吗?
猜你喜欢
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2014-08-14
  • 2012-12-07
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多