有随机访问AudioInputStream的例子吗?就像任何普通音频播放器一样 - 当您将小节带到任何您想要的地方并从任何地方播放时,我如何以这种方式访问音频流中的字节?
像这样简单的东西:read(byte[] buffer, long startingFrom)
其中 startingFrom 可以在音频流中我想要的任何地方
最佳答案
在 AudioInputStream
中使用(模拟?)随机访问与在普通 InputStream
中相同。您可以创建一个 mark()
在文件的开头,因此在对 read()
的任何调用完成之前。然后,当你想做随机访问时,你停止从流中读取,通过调用 reset()
转到标记位置。然后使用 skip()
去你想去的地方。
请注意,AudioInputStream
的初始“标记”默认为 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);
免责声明:我认为这具有创建随机访问的“技巧”。 令我惊讶的是,我几乎找不到关于使用 编辑:John Skeet同意我的这种做法。InputStream
中的标记/重置机制模拟随机访问的信息。这可能是因为它有一个警告。
关于java - AudioInputStream java 上的随机访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632195/