停止后,Java声音无法正常工作

时间:2017-02-24 04:02:02

标签: java audio javasound

这只是测试文件,我有我的Sound类,我从另一个主类调用它。它播放3秒,然后停止,然后它不再播放。可能是什么问题?

这让我发疯了。

声音等级

public class Sound {

    private static URL url1, url2, url3, url4;
    private static AudioClip gun, boom;
    private static Clip menuClip, gameClip;
    private static AudioInputStream menu, game;

    public static boolean menuPlaying, gamePlaying, explosionOn;

    public Sound() {
        menuPlaying = false;
        gamePlaying = false;
        url1 = Sound.class.getResource("/laserSound.wav");

        url2 = Sound.class.getResource("/boom.wav");

        url3 = Sound.class.getResource("/adventure.wav");

        url4 = Sound.class.getResource("/adventure.wav");

        gun = Applet.newAudioClip(url1);

        boom = Applet.newAudioClip(url2);

        try {
            game = AudioSystem.getAudioInputStream(url4);
            //menu = AudioSystem.getAudioInputStream(url3);
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void playGunSound() {
        gun.play();
    }

    public void stopGunSound() {
        gun.stop();
    }

    public void playExplosion() {
        boom.stop();
        boom.play();
    }

    public void stopExplosion() {
        boom.stop();
    }
    public void playGameMusic() throws LineUnavailableException {
        if (gamePlaying == false) {
            gameClip = AudioSystem.getClip();
            try {
                gameClip.open(game);
            } catch (
            LineUnavailableException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            gameClip.start();
            gameClip.loop(Clip.LOOP_CONTINUOUSLY);
            gamePlaying = true;
        }
    }

    public void stopGameMusic() {
            gameClip.stop();
            gamePlaying = false;

    } 

}

主要方法

public static void main(String[] args) throws LineUnavailableException, InterruptedException {
    Sound sound = new Sound();
    sound.playGameMusic();
    TimeUnit.SECONDS.sleep(3);
    sound.stopGameMusic();
    TimeUnit.SECONDS.sleep(3);
    sound.playGameMusic();
}

1 个答案:

答案 0 :(得分:1)

现在代码的方式,有一些奇怪的东西应该被清理。

首先,将gameClip.open放在一个单独的方法中会很好。您只需要打开一次Clip。只要您不关闭它,您就可以随意启动和停止它。就目前而言,每次播放时都会打开剪辑,每次执行此操作时,必须在剪辑播放之前将整个声音文件加载到内存中。这违背了Clip对象的目的。

其次,启动后跟循环是多余的。要么播放Clip。如果你想连续循环播放,只需调用循环方法,而不是启动。

在清理完这两件事之后,让我们重温一下代码,看看问题是否已经消失。我不清楚发生的问题是由于特定错误还是由于您的两个冗余代码操作之一是否正在创建未定义/意外情况。

您是否看过Clip API?

我对AudioClip没有经验。但我成功地使用了Clip。