Java Sound API:记录和监视相同的输入源

时间:2018-01-17 23:13:25

标签: java audio javasound

我尝试按照this示例从麦克风录制到wav文件。同时,我需要能够测试输入水平/音量,并在它太低时发送警报。我已经尝试了link中描述的内容,但似乎工作正常。

当尝试使用一个TargetDataLine同时记录和读取字节时出现问题(正在读取用于监视的读取字节以进行记录,反之亦然。

另一件事是这些是长进程(可能是几小时),所以应该考虑内存使用情况。

我该怎么办?克隆TargetDataLine的任何方法?用AudioSystem.write()写入时可以缓冲多个字节吗?有没有其他方法可以在不填充系统内存的情况下写入.wav文件?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

要进行音量测试,您必须将字节转换为某种合理的PCM数据。例如,如果格式是16位立体声little-endian,则可能需要两个字节并汇编为带符号的short或带符号的规范化float,然后进行测试。

我很抱歉在发布“解决方案”之前没有仔细查看您的示例。

我建议你扩展InputStream,制作一个同样执行音量测​​试的自定义版本。覆盖'read'方法,以便它从您测试卷的代码中获取它返回的字节。您必须修改卷测试代码以按字节为基础工作并传递所需的字节。

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

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