Java Sound Clip 在多次播放后无法播放
Posted
技术标签:
【中文标题】Java Sound Clip 在多次播放后无法播放【英文标题】:Java Sound Clip fails to play after multiple plays 【发布时间】:2013-08-30 16:21:33 【问题描述】:我在游戏中使用 Clips。剪辑播放正常,但经过一些“镜头”后,出现以下问题
线程“PulseAudio Eventloop 线程”java.lang.IllegalStateException 中的异常:排水失败 在 org.classpath.icedtea.pulseaudio.EventLoop.native_iterate(Native Method) 在 org.classpath.icedtea.pulseaudio.EventLoop.run(EventLoop.java:133) 在 java.lang.Thread.run(Thread.java:724)
我的代码:
public static Clip[] sounds;
...
sounds = new Clip[3];
sounds[0] = getClip("gun.wav");
sounds[1] = getClip("click.wav");
sounds[2] = getClip("over.wav");
...
private void playSound(Clip clp)
final Clip clip = clp;
Runnable soundPlayer = new Runnable()
@Override
public void run()
try
if(clip.isActive() || clip.isRunning()) clip.stop();
clip.setMicrosecondPosition(0);
clip.start();
catch (Exception e)
e.printStackTrace();
;
new Thread(soundPlayer).start();
public void shoot() //runs when space is clicked
if(canShoot) playSound(sounds[0]);
【问题讨论】:
java.lang.IllegalStateException 通常是在线程启动多次时引起的。 不确定您的getClip()
方法是如何实现的,但您应该尽量不要重复使用剪辑。
@MoritzPetersen 但游戏导出为小程序,我不想重新下载整个数据。
【参考方案1】:
所以我在 OS X 上遇到了类似的问题,如果您尝试停止剪辑并从头开始重新启动,剪辑有时无法播放。我通过在stop()
之后调用flush()
来修复它:
if(clip.isActive() || clip.isRunning())
clip.stop();
clip.flush();
【讨论】:
【参考方案2】:您不需要生成后台线程来与 Clip 进行交互。 Clip最常用的方法“start”和“stop”都是异步操作的,也就是说它们不会阻塞,所以应该可以从GUI/AWT/Swing线程调用。
这个页面有一些合理的例子: http://www3.ntu.edu.sg/home/ehchua/programming/java/J8c_PlayingSound.html
我看到您正在使用 IcedTea 和 PulseAudio。在此 JVM 中使用 javax.sound 时,您可能会遇到与 Oracle JVM 不同的行为,因为 javax.sound 的实现在这两个产品之间存在显着差异。
【讨论】:
其实我找到了解决办法:使用AudioClip。从默认线程调用 Clip 方法会导致延迟。以上是关于Java Sound Clip 在多次播放后无法播放的主要内容,如果未能解决你的问题,请参考以下文章
Java:快速淡入淡出 javax.sound.sampled.Clip 的增益