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