0

解决了

Runnable有问题,所以实际上有两个游戏线程同时运行。(等于问题!)所以第二个命中音频播放器的线程出错了,这就是为什么它听起来很回声——它是从两个不同的线程播放的!

我还按照建议使用 SourceDataLine 来启用更长的声音剪辑。

原帖——


当此代码触发时,会弹出一个错误说

IllegalStateException: Mixer is already open

clip.open()在线。我已经采取了所有措施来检查代码是否运行了两次,不是。但是,即使出现错误,声音仍然会播放。在较长的剪辑(30 秒)上,听起来好像有 2 种声音在播放,一个接一个。在非常长的剪辑(3 分钟)上,声音会断断续续。

stringFile是一个String,如"example.wav"

File soundFile = new File(stringFile);
AudioInputStream inputStream = AudioSystem.getAudioInputStream(soundFile);
AudioFormat format = inputStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
clip = (Clip) AudioSystem.getLine(info);
clip.open(inputStream);
clip.start();
playing = true;

如果这个问题已经发布,我很抱歉。我已经搜索过,我发现没有类似的线程。

4

1 回答 1

0

只是检查一下,但使用 Clip 的部分意义在于您可以将 Clip 保存在内存中并多次调用它,而无需从文件中重新加载它。

因此,要开始和停止,您可以使用 myClip.open()、myClip.start()、myClip.stop(),如果我阅读了教程正确。(我通常只使用 SourceDataLines,如果我有这个错误,请原谅我。)

如果您每次都从文件中重新加载它,这会导致或导致问题吗?无论如何,我会考虑切换到 SourceDataLine。除其他外,这消除了在开始播放之前必须将整个剪辑加载到内存中的开销。

顺便说一句,30 秒是很多 RAM。30 * 44100 = 1.323 MB(每帧只有 1 个字节,更常见的 wav 格式是该大小的 4 倍)。因此,随着您的声音较长,您可能会将您的 RAM 征税到页面交换的地步,这会导致卡顿。

于 2011-08-20T05:07:36.867 回答