AudioInputStream java上的随机访问

时间:2015-06-03 22:51:42

标签: java javax.sound.sampled

是否有随机访问AudioInputStream的示例?像任何普通音频播放器那样的东西 - 当你把它放在任何你想要的地方并且它可以从任何你想要的地方播放时,我如何以这种方式访问​​音频流中的字节?

像这样简单的事情:read(byte[] buffer, long startingFrom)其中startingFrom可以在音频流中的任何地方

1 个答案:

答案 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);

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