2015-06-03 56 views
2

有随机访问的AudioInputStream的例子吗?像任何普通的音频播放器那样 - 无论你想,当你把酒吧和它不管你想要玩,我怎么能访问字节音频流中以这种方式?随机存取

一些简单的类似:read(byte[] buffer, long startingFrom)其中startingFrom可无论我想要的音频流

+0

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

回答

1

使用在AudioInputStream(?模拟)随机访问中是一样的在正常InputStream。您可以在文件的开头创建mark(),所以read()任何电话已经完成了。然后,当你想要做的随机访问,停止从流中读取,去标记位置调用reset()然后用skip()去你想要的位置。

注意,最初的“标记”将默认为0的AudioInputStream,所以不需要初始呼叫。然而,这种行为没有被指定,所以将来可能会改变。

如果基础流(例如您给构造函数的InputStream)支持它,则AudioInputStream(Oracle Java 8)的实现支持此机制。你可以通过调用markSupported()来找到AudioInputStream是否支持它。

不幸的是,当使用AudioSystem的效用函数创建AudioInputStream时,您无法影响基础流。它甚至可以在每个平台上不同。如果你的数据流不支持它(或者你想绝对确定它支持它),你可以创建一个新的AudioInputStream,通过包装一个BufferedInputStream。例如像这样:

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

免责声明:我认为这有一个'黑客'来创建随机访问。 令我惊讶的是,我很少发现使用 InputStream中的标记/重置机制来模拟随机访问。这可能是因为它有一个警告。 编辑:John Skeet与我一致在这种方法。