当JavaFX程序启动时,我try 使用以下代码 struct 播放音频文件:

private void playSound() {
    try {
        Media media = new Media(
                getClass()
                        .getResource("/audio/maze-sound.wav")
                        .toExternalForm()
        );
        this.mediaPlayer = new MediaPlayer(media);
        this.mediaPlayer.play();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

出乎意料的是,我收到了以下异常,这是不应该发生的,因为我添加了媒体依赖项,并且它也应该具有所有其他依赖项.

Loading library gstreamer-lite from resource failed: java.lang.UnsatisfiedLinkError: C:\Users\gc\.openjfx\cache\21+31\amd64\gstreamer-lite.dll: Can't find dependent libraries
java.lang.UnsatisfiedLinkError: C:\Users\gc\.openjfx\cache\21+31\amd64\gstreamer-lite.dll: Can't find dependent libraries
    at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
    at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:331)
    at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:197)
    at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:139)
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2418)
    at java.base/java.lang.Runtime.load0(Runtime.java:852)
    at java.base/java.lang.System.load(System.java:2021)
    at javafx.graphics@21/com.sun.glass.utils.NativeLibLoader.installLibraryFromResource(NativeLibLoader.java:218)
    at javafx.graphics@21/com.sun.glass.utils.NativeLibLoader.loadLibraryFromResource(NativeLibLoader.java:198)
    at javafx.graphics@21/com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:140)
    at javafx.graphics@21/com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:56)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:115)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:108)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at javafx.media@21/com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at javafx.media@21/com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:240)
    at javafx.media@21/javafx.scene.media.Media.<init>(Media.java:392)
    at com.algorithms.maze/com.algorithms.maze.App.playSound(App.java:34)
    at com.algorithms.maze/com.algorithms.maze.App.start(App.java:26)
    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.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1135)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.UnsatisfiedLinkError: no gstreamer-lite in java.library.path: C:\Program Files\Eclipse Adoptium\jdk-21.0.1.12-hotspot\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\Eclipse Adoptium\jdk-21.0.1.12-hotspot\bin;C:\ffmpeg\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Users\gc\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Git\cmd;C:\Users\gc\AppData\Local\Microsoft\WindowsApps;.
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2458)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:916)
    at java.base/java.lang.System.loadLibrary(System.java:2059)
    at javafx.graphics@21/com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:168)
    at javafx.graphics@21/com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:56)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:115)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:108)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at javafx.media@21/com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at javafx.media@21/com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at javafx.media@21/com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:240)
    at javafx.media@21/javafx.scene.media.Media.<init>(Media.java:392)
    at com.algorithms.maze/com.algorithms.maze.App.playSound(App.java:34)
    at com.algorithms.maze/com.algorithms.maze.App.start(App.java:26)
    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.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    ... 1 more
Exception running application com.algorithms.maze.App

Pom.xml依赖项:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>21</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-media</artifactId>
        <version>21</version>
    </dependency>
</dependencies>

项目 struct :

C:.
|   .gitignore
|   mvnw
|   mvnw.cmd
|   pom.xml
|
+---.idea
|       .gitignore
|       compiler.xml
|       encodings.xml
|       jarRepositories.xml
|       misc.xml
|       uiDesigner.xml
|       vcs.xml
|       workspace.xml
|
+---.mvn
|   \---wrapper
|           maven-wrapper.jar
|           maven-wrapper.properties
|
\---src
    \---main
        +---java
        |   |   module-info.java
        |   |
        |   \---com
        |       \---algorithms
        |           \---maze
        |                   App.java
        |                   Cell.java
        |                   MazeController.java
        |                   MazeModel.java
        |                   MazeView.java
        |
        \---resources
            |   1322301.png
            |
            \---audio
                    maze-sound.wav

推荐答案

感谢@珠海和@Slaw帮助我解决了这个问题.

JavaFX的媒体模块依赖于Windows Media Feature Pack (if you are using an "N" edition of Windows),需要C编写的GStreamer-Lite媒体包.

GStreamer-lite包在JavaFX Maven模块或jmod或JavaFX SDK发行版中提供.在初始化JavaFX时,如果需要,GStreamer-lite将自动解压到缓存目录中,无需用户干预即可安装.

The Windows Media Feature Pack needs to be manually installed.

通过转至设置&>应用程序&>可选功能,确保已安装媒体功能包.

Optional features

编码快乐!

有关Windows Media功能包的Microsoft信息:

Windows 10/11 N包括与其他Windows 10/11版本相同的功能,但Windows Media Player和相关技术除外.客户可以通过安装Windows 10/11的N个版本的媒体功能包来恢复这些技术的功能.

Java相关问答推荐

Javascript更新alert 可扩展内容样式与CSS—按钮更多/更少

Character::Emoji不支持带数字的字符吗?

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

调用引发泛型异常的泛型方法时出现编译错误

获取字符串中带空格的数字和Java中的字符

第三方Jar pom.xml

JOOQ中的子查询使用的是默认方言,而不是配置的方言

无法在Java中处理PayPal支付响应

如何在Cosmos DB(Java SDK)中增加默认响应大小

我怎样才能让IntelliJ标记toString()的任何实现?

二进制数据的未知编码/序列化

如何在Java springboot中从一个端点发送多个时间响应?

Spring动态反序列化JSON可以是列表,也可以只是一个对象

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

为什么创建Java动态代理需要接口参数

基于距离的APACHE POI公式判断

spring 更新多项管理关系

双对象供应商

什么是;u〃;平均值;jdku;在java开发工具包中?

单例模式中热切初始化和惰性初始化的区别