如何完全加载音频但稍后播放?

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于如何完全加载音频但稍后播放?的主要内容,如果未能解决你的问题,请参考以下文章

如何在身体加载时播放音频?

尽管不使用自动播放标签,但 HTML 音频在页面加载时播放

HTML5 音频加载和播放无法在 iPad 上运行

HTML/JS - 在页面加载时播放音频文件

如何播放即时加载的声音

如何在点击时动态加载/播放/暂停多源 HTML5 音频?