java - 我的 Java 代码中的声音重叠和延迟问题

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

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

最佳答案

首先,您使用 Clip 的方式违反了其设计用途。剪辑应该预先加载到内存中,并保持在需要时可以调用的状态。然后,当需要播放提示时,您只需执行 start 方法,或者将帧位置重新定位回开头,然后调用 start。

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

从您所写的内容中我不清楚您是否想要同时播放提示,所以我还不知道如何回答您帖子的这一部分。

另外,我想推荐一个我专门为游戏音频使用而编写的类。它称为 AudioCue,您可以在 Java-gaming.org 查看它。 。代码源在 BSD 许可证下可用(换句话说,它是免费的,并且您可以编辑它)。我非常努力地使其尽可能像其他 Java 类,并在 Javadocs/API 中投入了大量工作。该类与 Clip 类似,但对于“即发即忘”播放来说稍微简单一些,并且具有附加功能(例如良好的音量、平移和速度控制)。无需加载“库”,只需将三个类粘贴到您的项目中,然后随意修改它。

关于java - 我的 Java 代码中的声音重叠和延迟问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864855/

相关文章:

java - 创建 Servlet Cookie

java - Gson序列化一般忽略空字符串

iphone - 使用麦克风作为MTAudioProcessingTap的输入

html - 创建一个 html5 音频并播放它不起作用

android - 在android中获取微录音频的指纹/语音打印

Android 强制 HDMI 音频

java - 使用Java从CSV文件读取时间戳

java - 在测试 AsyncRestTemplate 时防止期望已经声明异常

java - fabric8io docker-maven-plugin 组件和外部 Artifact

iphone - 麦克风输入到 iOS 设备上的扬声器输出?