以下代码:
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+/-.
Google 告诉我,这种情况过去已经发生过好几次,但未找到 mp3 编解码器。我已经安装了 ubuntu-restricted-extras、libavcodec60、libavformat60 和 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 中运行。
正如 CraigFoote 在评论中指出的那样,现有问题涵盖了您设置上的媒体播放问题。
Ubuntu 23.10 使用 libavcodec60 (https://packages.ubuntu.com/mantic/libavcodec60)。我们需要添加 支持 libavcodec60。
注意:仅添加对基于 ffmpeg 的 libavcodec 的支持。利巴夫 没有 libavcodec60 的版本。
该问题被标记为影响通过 ffmpeg 安装的 JavaFX 21 和 libavcodec 60,它们与您问题中提到的软件版本相同。
该问题已在 JavaFX 22 中修复。JavaFX 22 计划于 3 月 24 日正式发布 (GA)。因此,截至创建此答案之日,JavaFX 开发尚未最终确定。但是,JavaFX 的早期访问版本可用于尝试即将发布的版本的新功能和错误修复。这些可以在这些地方找到:
我建议尝试早期访问版本之一,看看 JDK-8317508 的修复是否已纳入这些版本之一。
使用 JavaFX 版本,对所有 JavaFX 组件使用相同版本。例如,如果您对 JavaFX Media 使用版本
22-ea+16
,请对其他 JavaFX 依赖项使用相同版本。
该问题也已向后移植到 JavaFX
22.0.2
分支,该分支尚未发布(JavaFX 目前最新的稳定版本是 22.0.1
)。