Java Clip(声音)'回声'而不是高效播放

时间:2011-08-18 19:17:28

标签: java audio clip

解决

Runnable出现问题,因此同时运行两个游戏线程。 (等于问题!)因此,击中音频播放器的第二个线程发出错误,这就是为什么它听起来很响亮 - 它是从两个不同的线程播放的!

我也按照建议使用SourceDataLine来启用更长的声音片段。

原帖 -


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

IllegalStateException: Mixer is already open

clip.open()行。我已经采取了各种措施来检查代码是否正在运行两次,但事实并非如此。但是,即使有错误,声音仍会播放。在较长的剪辑(30秒)上,它听起来像是2个声音播放,一个接一个。在真正长的剪辑(3分钟)声音口吃。

stringFileString,例如"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;

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

1 个答案:

答案 0 :(得分:0)

只是检查,但使用Clip的部分原因是你可以将Clip保留在内存中并多次调用它,而不必从文件中重新加载它。

因此,要启动和停止,您将使用myClip.open(),myClip.start(),myClip.stop(),并再次播放,myClip.setFramePosition(0)和myClip.start()if我正确阅读了教程。 (我通常只使用SourceDataLines,如果我错了,请原谅我。)

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

顺便说一句,30秒是很多RAM。 30 * 44100 = 1.323 MB(每帧只有1个字节,更常见的wav格式是该大小的4倍)。因此,使用较长的声音,您可能会对RAM造成负担,导致页面交换,从而导致口吃。