Java 声音API: 录音和监听相同的输入源

Java Sound API: Recording and monitoring same input source

我正尝试按照 this example. At the same time, I need to be able to test for input level/volume and send an alert if it's too low. I've tried what's described in this link 从麦克风录制到 wav 文件,似乎工作正常。

当尝试使用一个 TargetDataLine 同时记录和读取字节时出现问题(为监视而读取的字节在记录时被跳过,反之亦然。

另一件事是这些过程很长(可能几个小时),因此应考虑内存使用情况。

我应该如何进行这里操作?有什么方法可以克隆 TargetDataLine?我可以在用 AudioSystem.write() 写入时缓冲多个字节吗?有没有其他方法可以在不填满系统内存的情况下写入 .wav 文件?

谢谢!

如果您使用 TargetDataLine 来捕获类似于 the example given in the Java Tutorials 的音频,那么您可以访问一个名为 "data" 的字节数组。您可以循环遍历此数组以在输出之前测试音量。

要进行容量测试,您必须将字节转换为某种合理的 PCM 数据。例如,如果格式是 16 位立体声小尾数法,您可能需要两个字节和 assemble 到带符号的短整型或带符号的规范化浮点数,然后进行测试。


对于在发布我的 "solution".

之前没有更仔细地查看您的示例,我深表歉意

我建议您扩展 InputStream,制作一个也执行容量测试的自定义版本。覆盖 'read' 方法,以便它从测试卷的代码中获取它 returns 的字节。您必须修改容量测试代码以在每个字节的基础上工作并通过所需的字节。

然后,当您为输出到 wav 阶段创建 AudioInputStream 时,您应该能够使用这个扩展的 InputStream 作为参数。

我已经使用这种方法通过两个数据源成功保存音频:一次来自预先填充的数组,一次来自流式音频混合,通过 "mixer" 我写的组合音频数据源.后者更像是你需要做的。不过,我还没有从麦克风源做到这一点。但据我所知,同样的方法应该有效。