有随机访问的AudioInputStream的例子吗?像任何普通的音频播放器那样 - 无论你想,当你把酒吧和它不管你想要玩,我怎么能访问字节音频流中以这种方式?随机存取
一些简单的类似:read(byte[] buffer, long startingFrom)
其中startingFrom可无论我想要的音频流
有随机访问的AudioInputStream的例子吗?像任何普通的音频播放器那样 - 无论你想,当你把酒吧和它不管你想要玩,我怎么能访问字节音频流中以这种方式?随机存取
一些简单的类似:read(byte[] buffer, long startingFrom)
其中startingFrom可无论我想要的音频流
使用在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);
免责声明:我认为这有一个'黑客'来创建随机访问。
令我惊讶的是,我很少发现使用
编辑:John Skeet与我一致在这种方法。InputStream
中的标记/重置机制来模拟随机访问。这可能是因为它有一个警告。
似乎不太可能;流的整个想法是,你只能从头到尾阅读(或写)它们。看起来你可以用Java Sound API做的最好的是将整个文件读入内存(例如一个字节数组),然后从内存中播放它。 – immibis