Java 声音在我停止后不起作用

标签 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();
}

最佳答案

代码现在的样子,有一些奇怪的东西需要清理。

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

其次,开始后跟循环是多余的。两者都会播放剪辑。如果想连续循环播放,直接调用loop方法即可,不用start。

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

您看过 Clip API 了吗?

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

关于Java 声音在我停止后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42430550/

相关文章:

javascript - 智能带宽节省 : how to stop HTML5 mp3 audio file from loading unneccessarily, 同时显示总长度持续时间?

java - 如何在 hibernate 中添加键约束?

java - 将数据库值从 jsp 传递到 javascript

matlab - Matlab中音频的尺寸是多少?

java - mp3 文件流上的 getDuration : java. io.IOException:不支持标记/重置

java - 可靠的 Java 声音 API,用于简单的数字样本回放

java - 无法从输入 URL 获取音频输入流

java - 如何在没有提交模式的情况下从表单发送信息?

java - 伴随对象 Kotlin JNI 中的 UnsatisfiedLinkError

ios - 用户如何在 iOS Safari 中启用音频自动播放,以便 Amazon Polly 文本转语音功能按预期工作?