【问题标题】:Clip plays WAV file with bad lag in JavaClip 在 Java 中播放延迟很差的 WAV 文件
【发布时间】:2014-02-19 07:58:40
【问题描述】:

我编写了一个代码来读取 WAV 文件(大小约为 80 mb)并播放它。问题是声音播放不好(极度滞后)。你能告诉我有什么问题吗?

这是我的代码: (我在 Jframe 构造函数中调用 doPlay 函数)

private void doPlay(final String path) {
    try {
        stopPlay();
        InputStream is = new FileInputStream(path);
        InputStream bufferedIn = new BufferedInputStream(is);
        AudioInputStream ais = AudioSystem.getAudioInputStream(bufferedIn);
        AudioFormat format = ais.getFormat();
        // this is the value of format.
        // PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        clip = (Clip)AudioSystem.getLine(info);
        clip.open(ais);
        clip.start();
    } catch (Exception e) {
        stopPlay();
        e.printStackTrace();
    }
}

【问题讨论】:

    标签: java audio wav javasound


    【解决方案1】:

    问题是您需要在播放之前加载剪辑。剪辑在播放之前会完全加载到内存中。

    换句话说,clip.open() 之前的所有事情都应该在播放剪辑之前发生。当您准备好播放剪辑时,您应该使用的唯一命令是 clip.start()。要重播剪辑,请将其光标位置设置回开始并调用 clip.start()。

    如果剪辑足够短,您可以摆脱在播放它们的同时打开(加载)它们的低效编码做法。如果您真的想从文件而不是从内存中播放,请使用 SourceDataLine,它的启动速度要比 Clip 用于大文件时快得多。

    剪辑:必须先加载到内存中才能播放,加载后,它会以最少的 cpu 播放。专为小型且可重复使用的声音文件而设计。

    SourceDataLine:从文件位置播放,立即开始,消耗很少的内存(比 Clip 少得多),但由于文件读取,使用的 cpu 比 Clip 略多。最适合较大的单播放音频。

    LAG 的另一个来源:第一次调用声音文件时,由于从已编译的代码执行,它运行得有点慢。通过重用,声音代码被放入内存并以最小的延迟执行。因此,有时我会在程序开始时播放“无声”的声音来“启动泵”,这样当需要听到的第一个声音播放时,它会以更少的延迟播放。

    【讨论】:

    • 解释得很好。我将其标记为答案。谢谢。
    【解决方案2】:

    实际上,您的代码应该可以正常工作(在带有 +80mb 音频文件的 JFrame 构造函数中对其进行了测试),所以我只能给出一些建议:

    1. 您是否尝试过使用不同的音频文件和不同的音频格式(例如 aiff)来查看代码是否有任何不同?还可以使用较小的音频文件尝试您的代码。
    2. 使用 Clip 类时,音频数据被加载到内存中。你确定有足够的可用内存来存储整个文件吗?您是否尝试增加JVM heap size
    3. 您的代码是否涉及任何其他后台线程/计算,这可能会导致过多的 cpu 工作负载?

    【讨论】:

    • 是的,代码每0.1秒同时绘制近100个对象
    • 那么我建议从您的代码中删除对象的绘图,看看这是否解决了问题。如果是这样,那么延迟可能与您的音频播放无关,而是与您的对象绘制代码有关。
    • 问题是文件的大小。使用较小的文件,代码可以正常工作。但是为什么您的代码使用相同大小的文件?
    • 如果不查看文件和其余代码就很难判断。你的电脑规格是什么?我在一台相当旧的计算机上测试了它,它带有 Eclipse 中的 Windows XP、2.7 GHz、2 GB 内存和 JRE 7。其他相同大小的音频文件是否也会导致延迟还是只是这个文件?
    • 我还添加了我用于测试的完整代码 - 看看这个简化代码是否也会出现延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多