1

我在使用Clip接口在 Java 中正确播放声音时遇到问题。

使用以下方法播放声音:

clip = (Clip)mixer.getLine(dataLineInfo);
clip.open(audioFormat, byteData, 0, byteData.length);
clip.start();

但是,如果剪辑未关闭,则会出现内存泄漏。

我尝试在开始剪​​辑之前添加一个线路侦听器,并使用以下代码:

public void update(LineEvent e) {
    if (e.getType() == LineEvent.Type.STOP) {
        e.getLine().close();

但是,这会导致声音变差。

在该方法中添加 1 秒睡眠可以让我的机器再次运行 - 但我更喜欢更优雅的解决方案 - 我认为在侦听器方法中等待不是好的做法,其他机器可能需要更长的时间。

奇怪的是,停止事件是在声音停止之前的任意时间发送的。

有人对解决此问题的更好方法有任何想法吗?

(与thisthisthis有关,但对我来说都不是解决方案)

4

1 回答 1

1

这似乎是错误 4434125中描述的症状。

该错误注释中建议的解决方案是调用clip.drain()(在适当的线程中,因为它是一个阻塞调用),然后在排水完成时关闭剪辑(因为它将阻塞直到数据行的内部缓冲区被清空(根据Javadocs for排水法)。

于 2009-12-18T11:31:21.487 回答