我正在尝试使用JavaSound API创建音频过滤器来读取和写入音频文件。目前我的代码结构如下:
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()接受输入流。有什么想法吗?
答案 0 :(得分:2)
kasperjj的回答是正确的。您可能正在使用WAV文件。看看this 用于波形文件的布局。请注意,整个WAV文件的大小都在其标题中进行编码。
我不知道这是否适用于您的情况,但是如您所述处理WAV样本,您可以使用“常规”非音频Java输出流。例如,您可以使用FileOutputStream将它们写入临时文件,处理后可以将临时文件转换为有效的WAV文件。
答案 1 :(得分:1)
某些音频格式需要元数据来描述其标题中的流的长度(或块的数量),因此无法在整个数据集出现之前开始编写数据。为了让Java声音API能够处理具有相同API的所有格式,我怀疑他们不得不故意强加这个限制。
然而,有许多音频格式可以轻松流式传输。他们中的许多人都有java的开放库实现,所以如果你愿意添加一个外部库,那就不应该那么难了。
答案 2 :(得分:0)
如果重新实现AudioSystem.write方法,则可以解决此问题。它不适用于流和WAVE格式。您应该从AudioInputStream读取数据,将其缓存在字节数组中,处理数组并记录到wave文件。我建议您检查示例中的类:How to record audio to byte array