linux 在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

vohkndzv  于 4个月前  发布在  Linux
关注(0)|答案(1)|浏览(78)

代码如下:

public class HelloWorld extends Application {
    @Override
    public void start(Stage primaryStage) {
//        String audioFilePath = "AudioFileWithWavFormat.wav";
        String audioFilePath = "AudioFileWithMp3Format.mp3";

        String url = getClass().getClassLoader().getResource(audioFilePath).toExternalForm();
        Media media = new Media(url);
        MediaPlayer mp3Player = new MediaPlayer(media);
        mp3Player.setOnPlaying(() -> System.out.println("Playback started"));
        mp3Player.play();

        StackPane root = new StackPane();
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

字符串
.适用于.wav,但.mp3会导致此错误:

MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player!
    at javafx.media@21/javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:147)
    at javafx.media@21/javafx.scene.media.MediaPlayer.init(MediaPlayer.java:518)
    at javafx.media@21/javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:421)
    at ca.footeware.javafx.squeaker/ca.footeware.javafx.squeaker.HelloWorld.start(HelloWorld.java:25)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
    at javafx.graphics@21/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at javafx.graphics@21/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at javafx.graphics@21/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$10(GtkApplication.java:263)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: com.sun.media.jfxmedia.MediaException: Could not create player!
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:298)
    at javafx.media@21/com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118)
    at javafx.media@21/javafx.scene.media.MediaPlayer.init(MediaPlayer.java:474)

❯ neofetch
            .-/+oossssoo+/-.               craig@notebook 
        `:+ssssssssssssssssss+:`           -------------- 
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 23.10 x86_64 
    .ossssssssssssssssssdMMMNysssso.       Host: XPS 13 9310 
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Kernel: 6.5.0-14-generic 
  +ssssssssshmydMMMMMMMNddddyssssssss+     Uptime: 59 mins 
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Packages: 2388 (dpkg), 55 (flatpak), 17 (snap) 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Shell: bash 5.2.15 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Resolution: 3456x2160 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   DE: GNOME 45.1 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   WM: Mutter 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   WM Theme: Adwaita 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Theme: Yaru-sage-dark [GTK2/3] 
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/    Icons: Yaru-sage [GTK2/3] 
  +sssssssssdmydMMMMMMMMddddyssssssss+     Terminal: gnome-terminal 
   /ssssssssssshdmNNNNmyNMMMMhssssss/      CPU: 11th Gen Intel i7-1195G7 (8) @ 5.000GHz 
    .ossssssssssssssssssdMMMNysssso.       GPU: Intel TigerLake-LP GT2 [Iris Xe Graphics] 
      -+sssssssssssssssssyyyssss+-         Memory: 6506MiB / 15692MiB 
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.


谷歌告诉我,这在过去发生过几次,没有找到mp3编解码器。我已经安装了ubuntu-restricted-extras,libavcodec 60,libavformat 60和ffmpeg。我可以在Rhythmbox和Audacious中播放mp3。
有什么想法吗?
编辑:更多环境细节:

❯ java -version
openjdk version "21.0.1" 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-Ubuntu-223.10)
OpenJDK 64-Bit Server VM (build 21.0.1+12-Ubuntu-223.10, mixed mode, sharing)


https://gluonhq.com/products/javafx/下载了v21.0.1 javafx sdk和模块,并将其提取到主文件夹中,然后在NetBeans中引用。使用生成模块的pom构建,然后将JLink连接到运行时。虽然我编写代码时主要在NetBeans中运行。

csga3l58

csga3l581#

正如CraigFoote在评论中指出的那样,一个现有的问题涵盖了您的设置上的媒体播放问题。

Ubuntu 23.10使用libavcodec 60(https://packages.ubuntu.com/mantic/libavcodec60)。我们需要添加对libavcodec 60的支持。
注:将仅为基于ffmpeg的libavcodec添加支持。libav没有libavcodec 60的版本。
该问题被标记为影响通过ffmpeg安装的Ubuntu 23.10,JavaFX 21和libavcodec 60,这些软件版本与您的问题中提到的软件版本相同。
该问题已在JavaFX 22中得到修复。JavaFX 22计划于2024年3月发布。
在创建此答案时,JavaFX 22的开发尚未完成。但是,可以使用JavaFX的抢先体验版本来尝试即将发布的新功能和错误修复。这些可以在以下位置找到:

我建议尝试其中一个抢先体验版本,看看JDK-8317508的修复是否已经使其成为其中一个版本。
对 * 所有 * JavaFX组件使用相同的版本。例如,如果您对JavaFX Media使用22-ea+16版本,则对其他JavaFX依赖项使用该版本。
该问题已被反向移植到JavaFX 21.0.2分支,该分支尚未发布(JavaFX的当前最新稳定版本是21.0.1)。这意味着当21.0.2发布时,该修复程序将在长期支持(LTS)版本中提供。
asker测试了JavaFX 22-ea+16,并指出它解决了ubuntu 23.10中的mp3媒体播放问题:
我修改了我的pom来引入openjfx-22-ea+16,并将我的jdk升级到22-ea(不确定是否有必要),并在netbeans中运行,它播放mp3!

常见问题

我使用模块jlinked来创建运行时,是否意味着在另一台机器上运行应用程序的其他人不需要22-ea版的jdk或javafx?
简短的回答是肯定的,用户不需要在他们的系统上安装jdk或javafx的22-ea版本来使用你的软件。
当你使用Java和JavaFX的22-ea模块进行jlink时,jlink会生成一个自定义的Java运行时镜像,里面打包了这些模块。你可能不会在镜像的某个目录中看到JavaFX jmod文件。即使没有显示在某个目录中,它们仍然会打包在jimage format的运行时镜像文件中。
用户不需要在他们的机器上单独安装jdk或javafx版本来使用您的软件,因为Java运行时和JavaFX端所需的一切,以及所有应用程序代码,依赖的Java库和JDK和JavaFX的本地组件都已经打包在您创建的映像中。
您可以将jlink生成的镜像打包成您选择的包格式(例如.tgz.zip文件),用户可以下载并解包,然后使用jlink生成的脚本直接运行您的软件。
如何确保ffmpeg安装在系统上。
要使JavaFX媒体功能正常工作,需要安装底层本机平台的适当媒体回放工具。
对于Ubuntu 23.10,需要安装ffmpeg包,以允许某些JavaFX可播放媒体格式(如mp3)工作。
操作系统的本地打包系统(例如Ubuntu的.deb包)可以帮助打包和安装工作应用程序。在包定义中,指定所需的依赖包,例如ffmpeg。当有人下载并安装您的软件时,Ubuntu包管理器将确保安装正确的依赖项以使您的应用程序正常运行。
可以创建基于jlink输出的本机Java映像的.deb安装包:

  • 使用操作系统的命令行工具手动执行,或
  • 使用随JDK提供的jpackage软件,或
  • 在Maven或Gradle等构建工具中使用插件调用jpackage

另一种为应用程序使用.deb软件包的方法是修改jlink生成的默认启动脚本,以在启动应用程序之前检查是否安装了ffmpeg,如果尚未安装,则使用系统上的本机软件包管理器进行安装。
或者,您可以在应用程序启动时运行检查,如果媒体失败,则向用户提供一条消息,说明媒体功能已禁用,直到他们在系统上安装ffmpeg。也许使用ConditionalFeature.MEDIA进行检查可以查看是否支持媒体播放,但我认为对媒体使用情况进行额外的测试会更可靠。

相关问题