是否有随机访问AudioInputStream的示例?像任何普通音频播放器那样的东西 - 当你把它放在任何你想要的地方并且它可以从任何你想要的地方播放时,我如何以这种方式访问音频流中的字节?
像这样简单的事情:read(byte[] buffer, long startingFrom)
其中startingFrom可以在音频流中的任何地方
答案 0 :(得分:1)
在AudioInputStream
中使用(模拟?)随机访问与普通InputStream
中的相同。您可以在文件开头创建mark()
,以便在完成对read()
的任何调用之前。然后,当您想要进行随机访问时,您将停止从流中读取,通过调用reset()
转到标记位置,然后使用skip()
转到您想要的位置。
请注意,AudioInputStream
的初始“标记”默认为0,因此不需要初始调用。但是,未指定此行为,因此将来可能会更改。
AudioInputStream
(Oracle Java 8)的实现支持这种机制,如果底层流(例如您给构造函数的InputStream
)支持它。您可以通过调用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
中的标记/重置机制来模拟随机访问。这可能是因为它有一个警告。