树莓派4上JavaFX播放MP3遇MediaException问题求助
树莓派4 JavaFX MP3播放器「Could not create player!」问题解决
问题场景
在树莓派4上开发MP3播放器,因默认OpenJDK不含JavaFX,选用了自带JavaFX的Bellsoft/Liberica Java 13。但执行以下代码时触发MediaException: Could not create player!错误:
media = new Media("path/to/mp3-file"); MediaPlayer mp = new MediaPlayer(media);
完整报错栈:
Exception in Application init method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Exception in Application init method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:895) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.media/javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146) at javafx.media/javafx.scene.media.MediaPlayer.init(MediaPlayer.java:518) at javafx.media/javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:421) at sample.FX_Player.init(FX_Player.java:86) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:824) ... 2 more Caused by: com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:295) at javafx.media/com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118) at javafx.media/javafx.scene.media.MediaPlayer.init(MediaPlayer.java:474) ... 5 more Exception running application sample.FX_Player
已尝试多种路径格式均无效:
file:///home/pi/test.mp3 file:/home/pi/test.mp3 /home/pi/test.mp3
解决方案
1. 补全系统音频依赖库
树莓派上的JavaFX媒体组件依赖底层GStreamer解码库,Liberica自带的JavaFX可能未打包ARM架构对应的本地库,执行以下命令安装缺失依赖:
sudo apt-get install libopenjfx-java libopenjfx-jni gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
2. 用File类生成合法URL
避免手动拼接路径的格式错误,通过File类自动生成符合规范的URI:
File mp3File = new File("/home/pi/test.mp3"); Media media = new Media(mp3File.toURI().toString()); MediaPlayer mp = new MediaPlayer(media);
3. 验证MP3文件有效性
先确认媒体文件本身无损坏,用树莓派自带播放器测试:
omxplayer /home/pi/test.mp3
如果无法播放,更换正常的MP3文件重试。
4. 显式指定JavaFX模块路径
若Liberica的JavaFX模块加载异常,启动程序时手动指定模块路径(替换为你的Liberica Java路径):
java --module-path /opt/liberica-jdk-13/lib --add-modules javafx.media sample.FX_Player
5. 切换至OpenJFX ARM版本
若以上方法无效,可替换为OpenJFX官方ARM版:
- 下载对应ARM架构的OpenJFX SDK
- 启动时指定模块路径与媒体模块运行程序
内容的提问来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

