【问题标题】:Mediaplayer in JARJAR 中的媒体播放器
【发布时间】:2023-03-03 10:49:02
【问题描述】:

此代码在 Intellij 中编译,但在 jar 中不起作用。 使用getResourceAsStream()getResource 并不能解决问题。

(我已经尝试过使用像 Image image = newImage(getClass().getResourceAsStream("image.png"); 这样的 Image 并且它确实有效)

package Sound;

import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.io.File;

/**
 */
public class TestSound extends Application{

    public TestSound() {
        play();
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        new TestSound().play();
    }
    private void play(){
        String mainsound = "src/res/sound/main.mp3";
        Media i = null;
        i = new Media( new File(mainsound).toURI().toString());
        MediaPlayer mediaPlayer = new MediaPlayer(i);
        mediaPlayer.play();
        mediaPlayer.setStopTime(new Duration(120000));
        mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
    }
    public static void main (String[] args){
         launch(args);
 }
}

编辑:

  Media i = new Media(getClass().getClassLoader().getResource(mainsound));

不会工作,因为构造函数需要一个字符串。

还有

  Media i = new     Media(getClass().getClassLoader().getResource(mainsound).toString());
  new MediaPlayer(i).play();

不起作用。

当然 mainsound="res/sound/main.mp3";

用winrar提取jar后 我得到了声音词典,包括 testsound.class 和 main.mp3

还有另一个包含 main.mp3 的 res 字典

两个字典都在同一个根目录下。

【问题讨论】:

  • 路径错误。 src 文件夹不可能在运行时可用,尤其是在 jar 文件中。您需要使用具有正确路径的getClass().getResource(...)。通过命令行执行jar tf MyFile.jar来检查你生成的jar文件的内容;确保您在列表中看到 mp3 文件并记下它的路径。
  • 你有什么理由a)将play();添加到构造函数和start方法? b) 在start 方法中创建另一个TestSound 实例?
  • @James_D 是的,.mp3 在 Jar 中,文件路径是 C:Users/Max/Desktop/TestSound/res/sound/main.mp3 是否意味着,如果我更改路径罐子。我也必须改变资源的路径?
  • 不,您需要 jar 文件中 中的 mp3 路径,而不是在您的源或资源文件夹中。可能,根据您的 IDE 的配置,/sound/main.mp3 会如此,所以您可以使用getClass().getResource("/sound/main.mp3");,但我不知道您如何配置您的 IDE 来构建 jar 文件。如果您按照我之前评论中的建议列出 jar 内容会怎样?

标签: javafx jar media-player


【解决方案1】:

getClass().getResource("res/sound/main.mp3") 将查找相对于当前类名为res/sound/main.mp3 的资源。由于您的类位于 sound 包中,因此它会有效地查找 /sound/res/sound/main.mp3,这不是资源在 jar 中的位置。

如果显示 jar 文件中的条目列表

/sound/main.mp3

那么以下应该可以工作:

String mediaURL = getClass().getResource("/sound/main.mp3").toExternalForm();
// for debugging:
System.out.println(mediaURL);

Media i = new Media(mediaURL);

【讨论】:

    【解决方案2】:

    与其使用getClass ().getResource (...),不如像这样使用它

    Media m = new Media ("/myMedia.mp3");//if the media exists in default package
    

    Media m = new Media ("/mypackage/myMedia.mp3");//if the media exists in mypackage
    

    【讨论】:

    • OP 希望运行捆绑为 jar 文件的应用程序。如果媒体文件在 jar 中,这将如何工作?
    • 不起作用:java.lang.IllegalArgumentException:uri.getScheme() == null! uri == '/greeting.wav'
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多