Ubuntu 19.10 Eoan 无法播放我的 Java 程序的声音

Ubuntu 19.10 Eoan 无法播放我的 Java 程序的声音

最近安装了 Ubuntu 19.10 后,我一直在从事涉及播放音频的项目。文件类型不是很重要,wav、mp3,无论什么都可以。

但是,我无法让 Java 播放任何音频。没有出现任何错误,只是缺少声音。其他程序可以播放声音,我可以完美地打开 WAV / MP3,只是不能用 Java 程序。

我 99% 确定这不是我的代码的错误,因为:

  • 该代码在 Windows 上运行时运行良好(我是双启动)
  • 复制后stackoverflow 示例程序并运行它,仍然没有任何反应。

确实发现‘随处运行’的 Java 存在这个问题,这很有趣,但我离题了……

尝试了一些方法,列出可用的混频器并尝试使用它们,但无济于事。在没有错误抛出的情况下搜索错误并不容易。

于是,我尝试了 JavaFX,因为我听说它有音频播放功能。结果稍微好一点,抛出了一个错误;好极了!但错误描述不太清楚;糟糕!

我的JavaFX源代码是:

Media testMp3 = new Media(new File("chime2.wav").toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(testMp3);
mediaPlayer.setAutoPlay(true);

造成:

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.Controller.sayHelloWorld(Controller.java:20)
    ... 59 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)
    ... 61 more

再次,在线搜索,但只能找到 2015 年左右关于如何在 Java 9 中修复此问题(我正在运行 Java 11)以及关于安装 libavcodec53 的帖子,但我找不到太多相关信息。

我尝试过的事情:

  • 将 Java(和 JavaFX 版本)从 14 更改为 11 LTS
  • apt-get 安装 ffmpeg
  • apt-get 安装 ubuntu-restricted-extras
  • 安装 VLC,并使用 VLC 重新导出 WAV 文件

我还需要安装其他东西才能让 Java 播放我的音频吗?

答案1

我在相同的环境中遇到了相同的问题。但今天我尝试在 JDK 8 上运行我的 JavaFX 应用程序并且成功完成。

从以下 URL 下载 Oracle JDK 1.8.0_251: https://www.oracle.com/java/technologies/javase-downloads.html

答案2

问题出在 java 的“sound.properties”配置文件中。我现在使用的是 Ubuntu 20.04,使用的是 java-11-openjdk,因此,/etc/java-11-openjdk/sound.properties在末尾编辑并添加了以下几行:

javax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider
javax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider

欲深入了解,请阅读:https://keithp.com/blogs/Java-Sound-on-Linux/

相关内容