2

我正在尝试使用 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);

这会将输入文件作为流读取,对其进行处理并将其写入字节数组输出流,但它会等到整个文件处理完毕后再写入磁盘。理想情况下,我希望它在处理每个样本时将其写入磁盘。我已经尝试了几种流结构的组合,但找不到一种方法,因为 AudioSystem.write() 需要输入流。有任何想法吗?

4

3 回答 3

2

kasperjj 的回答是正确的。您可能正在使用 WAV 文件。查看 波形文件的布局。请注意,整个 WAV 文件的大小在其标头中进行编码。

我不知道这是否适用于您的情况,但要按照您的描述处理 WAV 样本,您可以使用“常规”非音频 Java 输出流。例如,您可以使用 FileOutputStream 将它们写入临时文件,处理后您可以将临时文件转换为有效的 WAV 文件。

于 2008-12-26T21:01:25.497 回答
1

某些音频格式需要在其标头中描述流长度(或块数)的元数据,因此无法在整个数据集出现之前开始写入数据。为了让 Java 声音 API 使用相同的 API 处理所有格式,我怀疑他们必须故意施加此限制。

然而,有许多音频格式可以轻松流式传输。他们中的许多人都有针对 java 的开放库实现,所以如果你愿意添加一个外部库,它应该不难完成。

于 2008-11-08T15:07:40.670 回答
0

如果您重新实现 AudioSystem.write 方法,则可以解决该问题。它不适用于流和 WAVE 格式。您应该从 AudioInputStream 读取数据,将其缓存在字节数组中,处理数组并记录到波形文件。我建议您检查示例中的类:如何将音频录制到字节数组

于 2016-08-28T10:04:25.120 回答