java - AudioInputStream java 上的随机访问

标签 java javax.sound.sampled

有随机访问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);

免责声明:我认为这具有创建随机访问的“技巧”。 令我惊讶的是,我几乎找不到关于使用 InputStream 中的标记/重置机制模拟随机访问的信息。这可能是因为它有一个警告。 编辑:John Skeet同意我的这种做法。

关于java - AudioInputStream java 上的随机访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632195/

相关文章:

java - 尝试从混音器(立体声混音)读取字节时出现 ArrayIndexOutOfBoundsException

java - 使用 JLayer 将 MP3 解码为 PCM 来检测幅度

java - 是否可以在 Eclipse 中自定义工具提示文本的字体?

java - 将大文件插入 Google 驱动器时出现 IOException "insufficient data written"

java - 分层模型中的泛型问题

java - 驾驶员中可能出现的赛车状况

Java 音频系统 : Reading 32 Bit Wav Files

java - 防止 Java 7/8 采样声音在播放时发出咔嗒声(适用于 6)

java - Java 中是否有一致的方法来跟踪剪辑(或音频文件)中的位置?

java - 这个 FragmentManager 在使用 #recylce() 后应该被回收