我正在尝试使用JavaSound接口创建一个音频过滤器来读写音频文件。目前我的代码结构如下:
ByteArrayOutputStream b_out = new ByteArrayOutputStream();
// Read a frame from the file.
while (audioInputStream.read(audioBytes) != -1) {
//Do stuff here....
b_out.write(outputvalue);
}
// Hook output stream to output file
ByteArrayInputStream b_in = new ByteArrayInputStream(b_out.toByteArray());
AudioInputStream ais = new AudioInputStream(b_in, format, length);
AudioSystem.write(ais, inFileFormat.getType(), outputFile);
这将以流的形式读取输入文件,对其进行处理并将其写入bytearrayoutputstream,但它会等待整个文件处理完毕后再写入磁盘。理想情况下,我希望它在处理每个样本时将其写入磁盘。我尝试了几种流构造的组合,但由于AudioSystem.write()接受输入流,因此找不到这样做的方法。有什么想法吗?
发布于 2008-12-26 13:01:25
kasperjj的答案是正确的。您可能正在处理WAV文件。查看this以了解wave文件的布局。请注意,整个WAV文件的大小都编码在其标头中。
我不知道这是否适用于您的情况,但是要像您所描述的那样处理WAV样本,您可以使用“常规的”非音频Java输出流。例如,您可以使用FileOutputStream将它们写入临时文件,在处理之后,您可以将该临时文件转换为有效的WAV文件。
发布于 2008-11-08 07:07:41
一些音频格式需要在其报头中描述流的长度(或块的数量)的元数据,因此在整个数据集出现之前不可能开始写入数据。为了让Java声音API使用相同的API处理所有格式,我怀疑他们必须故意施加这种限制。
然而,有许多音频格式可以很容易地流传输。它们中的许多都有针对java的开放的库实现,所以如果你愿意添加一个外部库,这应该不是很难做到的。
发布于 2016-08-28 10:04:25
如果重新实现AudioSystem.write方法,就有可能解决这个问题。它不能与流和WAVE格式一起工作。你应该从AudioInputStream读取数据,将其缓存到字节数组中,处理该数组并记录到wave文件中。我建议您检查示例中的类:How to record audio to byte array
https://stackoverflow.com/questions/274718
复制