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 在多次播放后无法播放的主要内容,如果未能解决你的问题,请参考以下文章

Ogg文件无法在手机上多次播放

Java:快速淡入淡出 javax.sound.sampled.Clip 的增益

在java中怎么获取音频的总时长?

Javas Audio Clips 在频繁播放哔声时出现问题

歌曲第一次播放但停止后不播放:Java 中的剪辑

关于java AudioInputStream播放短音频没声音的问题