2

是否有随机访问 AudioInputStream 的示例?就像任何普通的音频播放器一样——当你把酒吧带到你想要的任何地方并从你想要的任何地方播放时,我怎样才能以这种方式访问​​音频流中的字节?

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

4

1 回答 1

1

在 an 中使用(模拟?)随机访问AudioInputStream与在 normal 中相同InputStream。您可以在文件的开头创建一个mark(),以便在read()完成任何调用之前。然后,当您想要进行随机访问时,您停止从流中读取,通过调用转到标记位置reset(),然后使用skip()转到您想要的位置。

请注意,初始 'mark' 将默认为 0 AudioInputStream,因此不需要初始调用。但是,未指定此行为,因此将来可能会更改。

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

不幸的是,当使用实用程序函数AudioSystem创建时,AudioInputStream您无法影响底层流。它甚至可能因平台而异。如果您的流不支持它(或者您想绝对确定它确实支持它),您可以AudioInputStream通过将一个包装在BufferedInputStream. 例如像这样:

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

免责声明:我认为这有一个“黑客”来创建随机访问。令我惊讶的是,我几乎找不到使用InputStream. 这可能是因为有一个警告。编辑:John Skeet同意我对这种方法的看法。

于 2015-06-04T11:24:23.410 回答