播放声音剪辑的 Java 问题

Posted

技术标签:

【中文标题】播放声音剪辑的 Java 问题【英文标题】:Java problems playing sound clips 【发布时间】:2009-12-17 16:34:24 【问题描述】:

我在使用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 秒睡眠可以让我的机器再次运行 - 但我更喜欢更优雅的解决方案 - 我认为在侦听器方法中等待不是好的做法,其他机器可能需要更长的时间。

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

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

(与this、this 和this 相关,但都不是我的解决方案)

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢 - 这就是问题所在。 “旧的实现(Java 声音引擎)将不会被修复。”。因此,代码现在尝试使用系统默认混音器。

以上是关于播放声音剪辑的 Java 问题的主要内容,如果未能解决你的问题,请参考以下文章

杀死音频剪辑线程

如何在 Windows Phone 7 上播放在线声音剪辑?

使用javascript播放声音剪辑[重复]

剪辑不播放任何声音

在 iPhone 应用程序中播放声音剪辑的最简单方法是啥?

提高java中声音文件的播放速度