JavaSound 使用流写入音频文件

标签 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() 需要输入流。有什么想法吗?

最佳答案

kasperjj的回答是正确的。您可能正在使用 WAV 文件。看this 用于波形文件的布局。请注意,整个 WAV 文件的大小都编码在其 header 中。

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

关于JavaSound 使用流写入音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274718/

相关文章:

node.js - 将音频 Blob 数据从 React 前端发送到 Express 后端

java - 在 Java 中捕获扬声器输出

java - 检测加载程序的 SQLite 数据库上的更改

java - Android:我的异步方法有效吗?

java - 如果在 addHeader 之前写入正文,HttpServletResponse 会丢失 header 吗?

audio - gstreamer 将多 channel wav 文件拆分为单独的 channel 并将每个 channel 编码为 mp3、alac 等并保存到文件

java - 在 Eclipse 中提交之前自动运行 JUnit 测试

java - 如何使 JFileChooser 仅查看和选择声音文件并将它们保存在某个地方?

Java 同时播放多个 Clip

java - 读取 mp3 二进制数据以进行可视化