【问题标题】:How to completely load audio but play it later?如何完全加载音频但稍后播放?
【发布时间】:2015-05-19 14:55:19
【问题描述】:

所以,我有一个AudioInputStream,它从FileInputStream 读取。我想关闭FileInputStream,这将关闭AudioInputStream

有没有办法完全加载音频,这样我就不必直接从文件中流式传输它?

【问题讨论】:

  • 音频文件可能非常大 - 您确定要将其缓存在 RAM 中吗?
  • 是的,我正在创建一个库来管理资产,并且我已经将它设置为从文件加载资产,然后关闭文件输入流。图片文件也可以很大,我对它们做同样的事情。
  • 您可以将文件读入内存,然后在内存缓冲区顶部创建一个 ByteArrayInputStream 并从中播放音频。
  • 我想当我环顾四周时,我发现了一个类似的想法。唯一的问题是它不保留格式信息,因此会抛出不支持的音频异常。
  • 您正在提供与您在 cmets 中的问题相关的信息。不要那样做;而是更新您的问题。

标签: java audio javasound


【解决方案1】:

您可以将其存储在 Java Clip 中。

示例:

Clip clip = AudioSystem.getClip();
clip.open(/*your AudioInputStream*/);

让剪辑成为一个字段,以便以后使用。

【讨论】:

  • 伙计,我是不是很笨。我知道剪辑,但我从没想过要使用它们。非常感谢。还不能完全接受这个答案
【解决方案2】:

如果你想要一个AudioInputStream,你可以将整个文件加载到一个字节数组中:

static AudioInputStream load(File file) throws IOException {
    try (FileInputStream in = new FileInputStream(file)) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();

        byte[] buf = new byte[4096];
        for (int b; (b = in.read(buf)) > -1;) {
            bytes.write(buf, 0, b);
        }

        return AudioSystem.getAudioInputStream(
            new ByteArrayInputStream(bytes.toByteArray());
    }
}

或者在 Java 7 中:

static AudioInputStream load(File file) throws IOException {
    return AudioSystem.getAudioInputStream(
        new ByteArrayInputStream(Files.readAllBytes(file.toPath()));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2023-04-06
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多