我的Java代码

时间:2017-07-01 19:53:27

标签: java audio

我正在开展一个有趣的项目,并希望得到一些帮助。目前我正试图在我的游戏中实现声音。就目前而言,这是我的代码......

public static volatile boolean shutdown = false;

//This is a method to play sound

public static void play(String name) {
    shutDown();
    Runnable myRunnable = new Runnable() {

        public void run() {

            try {
                AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(Main.class.getResource(name));
                Clip clip = AudioSystem.getClip();
                clip.open(audioInputStream);
                clip.start();
                while (!shutdown) {
                }
                clip.close();
            } catch (Exception ex) {
            }

        }
    };

    Thread thread = new Thread(myRunnable);
    thread.start();
}

public static void shutDown() {
    shutdown = true;
    shutdown = false;
}

目前,我编写的代码有效。虽然我有一些问题。有时当我跑两次它可以互相播放音乐。另一个问题是,在我的声音开始之前,有时候会有明显的延迟。任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

首先,您使用Clip的方式与其设计用途相悖。剪辑意味着预先加载到内存中,并保留在您需要时可以调用的状态。然后,当它成为播放提示的时间时,您只执行start方法,或者可能将帧位置重新定位回开头,然后调用start。

凭借您现在所拥有的,您可以预期各种延迟问题。每次调用play时,系统都必须将整个文件加载到内存中。在这个阶段完全完成之前,它甚至不会开始玩。如果提示太大而您不想将其保留在RAM中,那么最好的办法是使用SourceDataLine而不是Clip。使用SourceDataLine,只有将缓冲区的值加载到内存后才会开始播放。

如果你想要同时播放提示,我不清楚你写的是什么,所以我还不知道如何回答你帖子的这一部分。

另外,我想推荐一个专门为游戏音频使用而写的课程。它被称为AudioCue,你可以在Java-gaming.org查看它。代码源在BSD许可下可用(换句话说,它是免费的,您可以编辑它)。我非常努力地使它尽可能地像其他Java类一样,并且在Javadocs / API中投入了大量的工作。该类与Clip类似,但对于 fire-and-forget 播放更简单,以及其他功能(例如,良好的音量,平移和速度控制)。不#"图书馆"要加载,只需将三个类粘贴到您的项目中,随时修改它。