使用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秒睡眠可以让我的机器再次运行 - 但我更喜欢更优雅的解决方案 - 我不认为在听众方法中等待是一种好习惯而其他机器可能需要更长时间。
在声音停止之前的任意时间发送停止事件是很奇怪的。
有没有人对更好的解决方法有任何想法?
答案 0 :(得分:1)
这似乎是bug 4434125中描述的症状。
该错误评论中建议的解决方案是调用clip.drain()
(在适当的线程中,因为它是阻塞调用),然后在排出完成时关闭剪辑(因为它将阻塞直到数据行的内部缓冲区已清空(根据Javadocs for the drain method)。