JavaSound用流写入音频文件

时间:2008-11-08 13:29:39

标签: java audio javasound

我正在尝试使用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()接受输入流。有什么想法吗?

3 个答案:

答案 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