当前位置: 首页 > 知识库问答 >
问题:

Java-频繁播放短音频片段时延迟

傅志文
2023-03-14

在网上研究了几天后,我来这里寻求帮助。我目前正在为朋友们开发一个简短的2D游戏(实际上只是为了好玩),几天前我了解了剪辑。在这个游戏中,玩家可以收集物体(几乎就像马里奥中的硬币一样)。我的问题是,我在收集硬币时会发出非常短的声音(50kB约1秒),如果玩家在1秒钟内收集3个硬币,那么剪辑会使游戏延迟。如果先例剪辑已经结束,那么就没有延迟。但是如果先例剪辑没有结束,那么尝试再次播放剪辑会使游戏延迟(非常多)。

我有一台很小的电脑,不是很强大,但是这个问题真的很烦人。当玩家投掷武器时,我也会遇到同样的问题。我有一个短片,如果玩家投掷武器太快,游戏就会延迟……

以下是我已经尝试过的事情:

    < li >使用一组剪辑(声音相同),并播放当前未播放的剪辑 < li >使用(相同声音的)不同剪辑,与之前相同 < li >制作(同一声音的)多个副本,并将其加载到不同的剪辑中 < li >制作一个单独的线程来播放声音,但我对线程一点也不放心:/

但是这些都没有改变这个问题...

现在这是我代码的一部分。首先是我用来将声音加载到Clip中的类。

package sound;

import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
// My own package
import utils.Utils;

public class SoundLoader {

public static Clip loadSound(String path) {
    Utils.log("Loading " + path + " ... ");

    try {
        URL url = SoundLoader.class.getResource(path);
        AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
        AudioFormat format = audioIn.getFormat();

        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip)AudioSystem.getLine(info);
        clip.open(audioIn);

        Utils.log("success\n");
        return clip;
    } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
        e.printStackTrace();
        Utils.log("failed !\n");
        return null;
    }
}   
}

现在是我管理所有声音的课程:

package sound;

import javax.sound.sampled.Clip;
// My own package   
import principal.Handler;

public class SoundManager {

    private Clip woosh;
    private Clip coin1;
    private Clip coin2;

    public SoundManager(Handler handler) {
        woosh = SoundLoader.loadSound("/resources/sounds/woosh2.wav");
        coin1 = SoundLoader.loadSound("/resources/sounds/coin1.wav");
        coin2 = SoundLoader.loadSound("/resources/sounds/coin2.wav");
    }

    public void wooshClip() {
        startClip(woosh);
    }
    public void coin1Clip() {
        startClip(coin1);
    }
    public void coin2Clip() {
        startClip(coin2);
    }   
    public synchronized void startClip(Clip clip) {
        clip.stop();
        clip.setFramePosition(0);
        clip.start();
    }
    public void loopClip(Clip clip) {
        clip.loop(Clip.LOOP_CONTINUOUSLY);
    }
    public void stopClip(Clip clip) {
        clip.stop();
    }

}

最后,当我想播放一个剪辑时,我使用我的“Player”类中的公共方法startClip()(显然代表播放器)。

< code>handler.getSoundManager()。woosh clip();

正如我看到的代码,如果Clip已经在播放,那么方法starClip()应该停止它并重新播放它。为什么它落后这么多?为什么即使我使用不同的剪辑,它也会滞后?如果我只是停止一个剪辑并重新播放它,那么什么会使我的游戏延迟?

我希望你能帮助我……我很少在网上找不到答案。如果你还需要什么来回答我,请告诉我!

谢谢你花时间回答这个长问题!

编辑:我在一台功能强大的电脑上尝试了我的游戏,因为音频剪辑,绝对没有延迟……但我的问题仍然存在!50kB的剪辑怎么会产生这么大的延迟??我真的不明白这个问题……

解决方案

我刚刚在这个项目中发现了一个解决方案:现在我的实体应该在玩家收集时播放声音(就像马里奥中硬币的声音),其中包含他们“死亡”的音频片段。我不明白为什么它现在有效,但它确实有效…

共有1个答案

王岳
2023-03-14

使用javafx中的< code > Java FX . scene . media . audio clip 而不是< code > javax . sound . sampled . clip 。AudioClip具有较低的延迟。

 类似资料:
  • 问题内容: 我试图顺序播放音频片段,但是它们都同时播放。我不确定自己在做什么错。能否请你帮忙。我正在使用JFrame,并且此代码给出了运行时错误。 问题答案: 你想要实现的功能是不可能的了,但它是一个到一个连接。请参见在2个剪辑之间切换的示例。

  • 音频的加载方式请参考:声音资源 使用 AudioSource 组件播放 在 层级管理器 上创建一个空节点 选中空节点,在 属性检查器 最下方点击 添加组件 -> 其他组件 -> AudioSource 来添加 AudioSource 组件 将 资源管理器 中所需的音频资源拖拽到 AudioSource 组件的 Clip 中,如下所示: 然后根据需要对 AudioSource 组件的其他参数项进行设

  • 本文向大家介绍web-audio 播放音频,包括了web-audio 播放音频的使用技巧和注意事项,需要的朋友参考一下 示例 要使用Web Audio API播放音频,我们需要获取音频数据的ArrayBuffer并将其传递给BufferSource进行播放。 要获得播放声音的音频缓冲区,您需要使用如下AudioContext.decodeAudioData方法: 最终承诺解决后,系统会以的形式为您

  • 音频播放组件,代替原生的 audio 标签 标题 内容 类型 通用 支持布局 N/S 所需脚本 https://c.mipcdn.com/static/v2/mip-audio/mip-audio.js mip-audio 用法和原生标签的用法基本相同,有所不同的是在 MIP 环境下,初始化的时间是由 MIP Runtime 决定,只有当标签在浏览器视窗内才会初始化,也就是所谓的懒加载。 mip-

  • 概述 音频播放模块兼容全系列makeblock主控板,内置语音解码芯片,可以播放音乐及录音。本模块接口是白色色标,说明是I2C信号控制,需要连接到主板上带有白色标识接口。插入TF内存卡即可感受音乐的快乐,使用起来非常方便。 技术规格 工作电压:5V DC 麦克风灵敏度(1Khz):50-54dB 麦克风阻抗:2.2 kΩ 麦克风信噪比:58 db 喇叭额定功率:1W 喇叭额定阻抗:8±15%Ω 通

  • 我正在开发一个音频播放器,它可以在后台播放音频文件。我的问题是,当录像机或视频播放器启动时,我需要暂停音频播放器。 有什么方法可以处理这个任务吗?例如,我有来处理这些调用。当我接到呼叫或wnat呼叫时,我们可以使用呼叫状态暂停播放器。我想为录像机或视频播放器以及相同的场景。当视频/录制开始时,我需要暂停音频播放器。