【问题标题】:Random Access on AudioInputStream javaAudioInputStream java上的随机访问
【发布时间】:2015-08-18 09:03:22
【问题描述】:

有随机访问 AudioInputStream 的例子吗?就像任何普通的音频播放器一样——当你把酒吧带到任何你想要的地方并从你想要的任何地方播放时,我怎样才能以这种方式访问​​音频流中的字节?

像这样简单的东西:read(byte[] buffer, long startingFrom) where startingFrom 可以是音频流中我想要的任何位置

【问题讨论】:

  • 似乎不太可能;流的整个想法是您只能从头到尾读取(或写入)它们。看起来你可以用 Java Sound API 做的最好的事情是将整个文件读入内存(例如字节数组),然后从内存中播放。

标签: java javax.sound.sampled


【解决方案1】:

AudioInputStream 中使用(模拟?)随机访问与在普通InputStream 中相同。您可以在文件开头创建一个mark(),因此在对read() 的任何调用之前完成。然后,当您想要进行随机访问时,您停止从流中读取,通过调用reset() 转到标记位置,然后使用skip() 转到您想要的位置。

请注意,AudioInputStream 的初始“标记”默认为 0,因此不需要初始调用。但是,未指定此行为,因此将来可能会更改。

AudioInputStream (Oracle Java 8) 的实现支持这种机制,如果底层流(例如你给构造函数的InputStream)支持它。您可以通过调用markSupported() 来查看AudioInputStream 是否支持它。

不幸的是,当使用AudioSystem 中的实用程序函数创建AudioInputStream 时,您无法影响底层流。它甚至可能因平台而异。如果您的流不支持它(或者您想绝对确定它支持它),您可以通过将一个包装在BufferedInputStream 中来创建一个新的AudioInputStream。比如这样:

AudioInputStream normalStream = AudioSystem.getAudioInputStream(...);
AudioInputStream bufferedStream = new AudioInputStream(new BufferedInputStream(normalStream),
                                    normalStream.getFormat(), AudioSystem.NOT_SPECIFIED);

免责声明:我认为这有一个“黑客”来创建随机访问。 令我惊讶的是,我几乎找不到关于使用InputStream 中的标记/重置机制来模拟随机访问的信息。这可能是因为有一个警告。 编辑:John Skeet 同意我对这种方法的看法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多