我正在尝试使用 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() 需要输入流。有什么想法吗?
最佳答案
kasperjj的回答是正确的。您可能正在使用 WAV 文件。看this 用于波形文件的布局。请注意,整个 WAV 文件的大小都编码在其 header 中。
我不知道这是否适用于您的情况,但要按照您的描述处理 WAV 样本,您可以使用“常规”非音频 Java 输出流。例如,您可以使用 FileOutputStream 将它们写入临时文件,处理后您可以将临时文件转换为有效的 WAV 文件。
关于JavaSound 使用流写入音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274718/