【问题标题】:Clip sometimes does not play剪辑有时不播放
【发布时间】:2015-07-14 05:38:27
【问题描述】:

我有一个 Sound 类,其中包含一个方法,当调用该方法时,该方法使用 Clip 对象(在本例中为 clip)播放声音。

public static void play() {
    clip.stop();                // The purpose of the first three lines
    clip.flush();               // is to restart the Clip object so it
    clip.setFramePosition(0);   // can be played multiple times.
    clip.start();
}

Clip 对象的实例化发生在单独的静态方法中,该方法在此方法之前调用,这就是上述方法可以声明为静态的原因。

另一个实现KeyListener的类包含以下代码:

public void keyPressed(KeyEvent e) {
    Sound.play(); // Sound is the class that implements the previous method.
}

因此,我的代码应该在每次按下键时播放与clip 相关的声音。但是,如果我快速反复按下某个键,声音有时会不播放。这在一段时间后尤其明显(似乎每次按键后问题都会变得更糟)。

为什么会发生这种情况,我该如何规避这个问题?

【问题讨论】:

    标签: java audio clip javax.sound.sampled


    【解决方案1】:

    我过去也遇到过同样的问题,对我有用的方法是在一行结束时添加一个行监听器,然后关闭它。

    下面的代码是我使用的精简版:

    music = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream(Sound.class.getResource("/sounds" + filename));
    music.open(ais);
    
    music.addLineListener(new LineListener(){
        public void update(LineEvent e){
            if(e.getType() == LineEvent.Type.STOP){
                e.getLine().close();
            }
        }
    });
    
    music.start();
    

    创建剪辑时,只需添加线路监听器。当您使用播放功能重置剪辑时,它应该可以正常播放。我希望这对你有用!

    【讨论】:

    • 是否可以在不使用 LineListener 的情况下进行修复?另外,我使用超过 15 个 Clip 对象这一事实是否会导致延迟?
    • @Kootling 每个 Clip 对象都会创建一个单独的线程,因此这可能是出现延迟的一个很好的理由。但是,在大多数机器上,这应该不是什么大问题。
    【解决方案2】:

    我是通过类似问题中的参考资料看到这篇文章的。

    是的,一次播放的剪辑数量会导致延迟,但我不知道如何预测它会产生多大的影响,因为这取决于 JVM 与操作系统的交互方式。

    您可以通过减小 Clip 的缓冲区大小来缓解这种情况。 SourceDataLine 和 Clip 似乎都只允许在缓冲区边界与传入请求进行交互(我不确定这是 100% 准确的声明)。指定剪辑的缓冲区大小有点迂回,因为它需要以 PCM 数组的形式获取数据。但如果你想尝试一下,API 是here

    减少行数的一个好方法是使用像TinySound 这样的声音库。 Java-gaming.org 的许多程序员都成功地使用了这个库。

    我正在推广的另一个替代方案是AudioCue,这是我最近为并发Clip 回放编写的一个类。许可证是 BCD,提供源代码,因此请随意检查、修改和使用代码。 AudioCue 不会减少输出行的数量(目前)。但是,如果您正在做管理同一提示的多个副本的常见事情,那么在这方面它可能会有所帮助,因为所有并发实例都被混合为单个输出。基本原理:文件被加载到一个数组中并通过 cursors 播放,该光标遍历数组并将它们的输出合并到一个SourceDataLine 中。此设置还允许实现平滑的实时音量、声像和音调衰减。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多