AudioInputStream 上的随机访问 java

Random Access on AudioInputStream java

有随机访问AudioInputStream的例子吗?就像任何普通音频播放器一样 - 当您将小节带到任何您想要的地方并从任何地方播放时,我如何以这种方式访问​​音频流中的字节?

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

AudioInputStream 中使用(模拟?)随机访问与在正常 InputStream 中相同。您可以创建一个 mark() at the beginning of the file, so before any calls to read() have been done. Then, when you want to do random access, you stop reading from the stream, go to the marker position by calling reset() and then use skip() 以转到您想要的位置。

请注意,对于 AudioInputStream,初始 'mark' 将默认为 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);

免责声明:我认为这有一个 'hack' 来创建随机访问。 令我惊讶的是,我几乎找不到关于使用 InputStream 中的 mark/reset 机制模拟随机访问的信息。这可能是因为它有一个警告。 编辑:John Skeet 同意我的这种方法。