Java 在 Windows 上播放音频,但在 Ubuntu 上不播放

Posted

技术标签:

【中文标题】Java 在 Windows 上播放音频,但在 Ubuntu 上不播放【英文标题】:Java plays audio on Windows but not on Ubuntu 【发布时间】:2020-04-30 15:59:53 【问题描述】:

我一直在写一个 Java 程序来播放 .wav 格式的曲子。

在开发过程中,音频在我的 Windows 机器上播放良好,但是在 Ubuntu 上尝试相同的代码时,音频无法播放。控制台没有记录任何错误,我按下“播放”按钮,没有任何反应。

这是我一直在使用的代码,还包含一些日志记录代码:

try 
    System.out.println("All mixers:");
    for (Mixer.Info m : Audiosystem.getMixerInfo()) 
        System.out.println(m.getName());
    

    System.out.println("Default mixer: " + AudioSystem.getMixer(null).getMixerInfo());

    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("bsc.wav"));
    Clip clip = AudioSystem.getClip();
    clip.open(audioInputStream);
    clip.start();
 catch (UnsupportedAudioFileException ex) 
    ex.printStackTrace();
 catch (IOException ex) 
    ex.printStackTrace();
 catch (LineUnavailableException ex) 
    ex.printStackTrace();

这个输出:

All mixers:
Port HDMI [hw:0]
Port PCH [hw:1]
Port Snowball [hw:2]
HDMI [plughw:0,3]
HDMI [plughw:0,7]
HDMI [plughw:0,8]
PCH [plughw:1,0]
PCH [plughw:1,1]
PCH [plughw:1,2]
Snowball [plughw:2,0]
Default mixer: HDMI [plughw:0,3], version 5.3.0-51-generic

认为这更可能是我的设置问题而不是代码问题,因此认为这适合超级用户。也写了一些代码来尝试其他可用的混音器,但这些都不起作用。

环顾四周,确实听说需要安装 JMF,但找不到它是否真的是解决方案。

运行 Ubuntu 19.10 和 Java 11.0.7 OpenJDK。

编辑1;在 *** 上找到了关于 Java Sound 的 this page。尝试运行示例代码但也无济于事...

【问题讨论】:

现在大多数东西都默认禁用 Java。 @Tetsujin 这只是一个个人的小项目,我认为我不会在任何地方发布,所有 java 都应该在我的机器上运行 【参考方案1】:

这里有几件事需要调查和(可能)排除。

您的按钮是 JavaFX 吗?如果是,您是否验证过 JavaFX 工作正常? 您是否验证了正在创建的File 对象的地址? 尝试使用 URL 作为您的 AudioSystem.getAudioInputStream 参数,并使用 class.getResource(URL) 进行设置。 使用 ais 获取 Dataline.Info 对象作为该过程的一部分。

Dataline.Info的使用代码如下:

AudioInputStream ais = AudioSystem.getAudioInputStream(url);
DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);

您可以在播放之前在调试器中检查Clip。检查 .audioData 属性,以验证数据是否已加载到内存中。您也可以在此处验证音频格式。

我刚刚经历了一个复杂的尝试,试图让一个在 Windows 中制作的 jar 文件在 Ubuntu 18.04 上执行。事实证明它实际上与 JavaFX 相关。一旦我解决了这个问题,程序就会运行(包括它的音频)。在处理音频资产时,我总是使用 URL。

【讨论】:

感谢您如此详细的回复!要回答您的第一个问题,这只是一个 Swing 应用程序,没有 JavaFX。 进行了更多测试,但不幸的是,似乎可以排除这两种可能性。 Clip 对象似乎确实被填充(30,000,000 个不同的字节),所以看起来加载之前工作(虽然你是对的,getResource() 更好),并且切换到 DataLine 代码似乎没有什么区别 这已经超出了我的熟悉范围。由于 Clip 已填充,接下来我很想尝试不同的线路(混音器),而不是使用默认线路。您是否检查/验证了您的 ubuntu 声音配置?我有一张声卡,并选择了该设备进行输出。对于我的 Java,默认输出混合器对齐。但是我在这个级别上工作有点不稳定。我不熟悉雪球。这不是某种 AWS 工具吗?为什么它被列为声线? (太明显了:其他应用发出声音好吗?) 嗯,我确实尝试了每个混音器,但不幸的是无济于事。 Snowball 是我插入的麦克风的名称(Blue Snowball)。尝试运行 Minecraft 并且可以产生很好的声音,但是给出的示例 Java 代码没有......

以上是关于Java 在 Windows 上播放音频,但在 Ubuntu 上不播放的主要内容,如果未能解决你的问题,请参考以下文章

Swift 应用程序上的 AVPlayer 显示黑屏,但在播放视频时播放音频

如何在 Java for Windows 中选择和操作不同的音频驱动程序

视频不在设备上播放,但在播放 ov 模拟器

如何让我的 Java 应用程序在 Linux 中播放好音频?

MPMoviePlayerController 中断 AirPlay iPod 音频,但在设备上工作正常

如何在 Windows 上使用 C++ 在特定音频设备上播放声音?