如何完全加载音频但稍后播放?
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()));
【讨论】:
以上是关于如何完全加载音频但稍后播放?的主要内容,如果未能解决你的问题,请参考以下文章