JAR 中的媒体播放器

Mediaplayer in JAR

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

(我试过像 Image image = newImage(getClass().getResourceAsStream("image.png"); 这样的图像,它确实有效)

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();

无效。

当然是主音="res/sound/main.mp3";

用winrar解压jar后 我得到了声音字典,包括 testsound.class 和 main.mp3

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

两本词典同根

与其使用 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

getClass().getResource("res/sound/main.mp3") 将查找与当前 class 相关的名为 res/sound/main.mp3 的资源。由于您的 class 在 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);