最近安装了 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