在 Raspberry Pi 3 上使用 JavaFX 11 播放 mp3

Play mp3 with JavaFX 11 on Raspberry Pi 3

我想在 Raspberry Pi 3 上获得 Java 11 和 JavaFX 11 运行。 我在这里按照 Gluon 给出的说明进行操作:http://docs.gluonhq.com/embedded/ (唯一的区别:我是 运行 完整的 Stretch 图像,而不是 Lite,同时 BellSoft 发布了 Liberica JDK 版本 11.0.1 也适用于 ARM,所以我使用了它。)

我的应用程序非常简单:一个标签和一个按钮,当按下按钮时将播放 mp3:

public class HelloFX extends Application
    {
    @Override
    public void start(Stage stage) {
        String version = System.getProperty("java.version");
        String fxVersion = System.getProperty("javafx.runtime.version");
        Label l = new Label ("Java version: " + version + "\nJavaFX version: " + fxVersion);
        Button b = new Button("play");
        Scene scene = new Scene(new VBox(l, b), 350, 200);
        b.setOnAction(
                new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent event) {
                        PlayMp3();
                    }
                });

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

    Media media;

    void PlayMp3()
    {
        String resource = "/resources/sound.mp3";
        media = new Media(getClass().getResource(resource).toURI().toURL().toString());

        MediaPlayer mp = new MediaPlayer(media);
        mp.play();
    }

在 Windows/Eclipse 上运行并播放 mp3。在 Raspberry Pi 上,我可以使用此命令执行应用程序:

sudo /opt/jdk-11.0.1/bin/java --module-path=/opt/armv6hf-sdk/lib/ --add-modules javafx.graphics,javafx.media  -cp /home/pi/Java/HelloFX/ -Dprism.verbose=true -Dembedded=monocle -Dglass.platform=Monocle javafx11.HelloFX

图形在显示屏上可见,但当我按下按钮时出现以下异常:

Exception in thread "JavaFX Application Thread" java.lang.UnsatisfiedLinkError: no jfxmedia in java.library.path: [/usr/java/packages/lib, /lib, /usr/lib]
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
    at java.base/java.lang.System.loadLibrary(System.java:1867)
    at javafx.graphics/com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:150)
    at javafx.graphics/com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:62)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new[=13=](NativeMediaManager.java:136)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:107)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at javafx.media/com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at javafx.media/com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:239)
    at javafx.media/javafx.scene.media.Media.<init>(Media.java:393)
    at javafx11.HelloFX.PlayMp3(HelloFX.java:62)

我发现一些帖子说此错误消息意味着 Java 正在寻找一个名为 "libjfxmedia.so" 的库,但我无法在任何地方找到该文件。

我有没有犯错或遗漏了什么?

我是否需要更改 java 命令中的某些内容才能执行应用程序? (我不确定 --add-modules 参数,它在没有这个选项的情况下运行相同...)

有没有可能 JavaFX 11 仍然不支持 Raspberry Pi 上的媒体(我读到 Gluon 也提供了 v8,但不支持)?向谁请教近期会不会支持?

José Pereda 写的是正确的,javafx.media 没有包含,它也没有包含在 11 版本中。 但同时事情发生了变化,BellSoft 最近发布了他们的 Liberica 软件包(Java 包括 JavaFX)版本 14.0.1,现在可以播放 mp3: https://bell-sw.com/pages/downloads/?version=java-14&release=14.0.1+8&os=Linux&bitness=32-bit&architecture=ARM&package=jdk-full

仍然存在一些小错误(例如 mp3 文件名不能包含空格,任何 mp3 的长度总是无限的)但基础工作正常,它甚至可以播放视频,只需查看他们的博客: https://bell-sw.com/announcements/2019/09/12/JDK-JavaFX-Video-Preview/

请确保真正使用 14.0.1 而不是第一个 14 版本,因为有几个修复尤其是。因为 Raspberry Pi 已在那里实施。

感谢 BellSoft 团队的出色工作!