为什么 JavaFX MediaPlayer 音频播放在 Windows 和 Mac 上运行良好,但在 Linux (popOS/Ubuntu) 上却出现问题?

问题描述 投票:0回答:1

我有一个 JavaFX 俄罗斯方块游戏,它使用 MediaPlayer 类来播放音乐和音效。具体来说,在处理所有音频的 SoundPlayer 类中,我在游戏启动时加载游戏的 .wav 文件,并迭代每个文件,为每个文件创建一个 Media 对象,然后为每个 Media 对象创建一个 MediaPlayer 对象。每个声音对应一个 MediaPlayer,它们存储在一个数组中,以便将来使用类的 playSound 方法进行播放,该方法接受一个整数参数,该参数指示与所需音效相对应的 MediaPlayer 的索引。它在 Windows 和 Mac 上完美运行,但在我运行 popOS 的笔记本电脑上,虽然它在技术上可以运行,但存在以下问题:

  • 游戏启动时,部分声音可以正常播放,但播放几次后,播放音量会变得小得几乎听不见,尽管MediaPlayer的实际音量属性没有改变

  • 有些声音不播放整个声音,只播放部分声音。

背景音乐和大多数声音都可以正常工作,但对于某些声音来说,会出现这些问题。 这是我在游戏触发时播放声音的代码:

public void playSound(int index)
{
     MediaPlayer mediaPlayer = mediaPlayerList[index];
     mediaPlayer.stop();
     mediaPlayer.seek(Duration.ZERO);
     mediaPlayer.play();
}

这在我的其他计算机上完美运行,但我只在我的 popOS 笔记本电脑上遇到这个问题。 有谁知道这是否是 Java.sound 工作方式的 Linux 问题,或者是否是我的笔记本电脑硬件的问题?我尝试配置 java.sound.config 文件但无济于事,不知所措。

如上所述,我尝试查找 java.sound 配置文件的修复程序,但我发现似乎没有任何效果,所以我开始认为这可能是我的笔记本电脑的问题,但我想我会问一下是否任何人都知道我可能错过的任何事情。我目前是一名计算机科学学生,这是我第一次尝试使用 Java 进行音频播放的项目,所以我对它在低级别上的工作原理相当无知。如果有人知道任何修复或潜在原因,我们将不胜感激。另外,我的音频驱动程序是最新的,我在这台笔记本电脑上尝试过的所有其他音频播放都工作正常。

最初,我使用 Java Sound API 的 Clip 类来播放音效,并且使用 Clips 可以正确播放音频,但我对 Clips 的问题是,当用户输入快速触发声音时,就像我的游戏中经常出现的情况一样,我发现音频经常跳过,可能是由于我对多线程的了解有限,所以我决定尝试 JavaFX 的 MediaPlayer,它的响应速度和优化程度要高得多,并且正如我所说,在我的 Windows 机器和 mac 上完美运行.....仅在我的 Linux 笔记本电脑上出现此问题。如果有任何帮助,我正在使用 openjdk-17....我不知道这是否是 open-jdk 与 oracle jdk 特有的问题,或者类似的问题。

java linux ubuntu javafx javasound
1个回答
0
投票

开源 AudioCue 库(可通过 Maven 获得)基本上是一个

Clip
,它是为支持多线程而编写的。它应该适合您,并且可以免费使用。

评论中有多个好的观点(应该是为了提出问题和澄清原始帖子,afaik),在我看来,这些观点很可能被列为“答案”。我在这里的回答将重复其中一些观点。

对于短提示,更喜欢只加载一次并且可以直接从内存中播放多次的类:

Clip
AudioClip
,而不是需要从文件或其他形式的流中读取的类:
SourceDataLine
MediaPlayer

AudioClip
的好处是它支持并发播放,与
Clip
或流式播放方法不同。因此,您可以使用相同的
AudioClip
并多次播放它,而无需先调用
stop
方法并重新定位其播放位置。每次迭代都应该进行到底。

曾经有一段时间,一些 Linux 操作系统只允许在给定时刻播放单个音源,但那是很久以前的事了。 IDK 如果这可能是您正在测试的特定操作系统配置的问题。如果是的话,回到我在开始时提到的

AudioCue
库,它有一个类
AudioMixer
,用于将所有声音提示汇集到单个输出线中,这可能是这种情况的一个很好的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.