我尝试按照this示例从麦克风录制到wav
文件。同时,我需要能够测试输入水平/音量,并在它太低时发送警报。我已经尝试了link中描述的内容,但似乎工作正常。
当尝试使用一个TargetDataLine
同时记录和读取字节时出现问题(正在读取用于监视的读取字节以进行记录,反之亦然。
另一件事是这些是长进程(可能是几小时),所以应该考虑内存使用情况。
我该怎么办?克隆TargetDataLine
的任何方法?用AudioSystem.write()
写入时可以缓冲多个字节吗?有没有其他方法可以在不填充系统内存的情况下写入.wav文件?
谢谢!
答案 0 :(得分:1)
如果您使用TargetDataLine
来捕获类似于the example given in the Java Tutorials的音频,那么您可以访问名为“data”的字节数组。您可以在输出之前循环遍历此数组以测试音量级别。
要进行音量测试,您必须将字节转换为某种合理的PCM数据。例如,如果格式是16位立体声little-endian,则可能需要两个字节并汇编为带符号的short或带符号的规范化float,然后进行测试。
我很抱歉在发布“解决方案”之前没有仔细查看您的示例。
我建议你扩展InputStream
,制作一个同样执行音量测试的自定义版本。覆盖'read'方法,以便它从您测试卷的代码中获取它返回的字节。您必须修改卷测试代码以按字节为基础工作并传递所需的字节。
当您为输出到wav阶段创建InputStream
时,您应该能够使用此扩展AudioInputStream
作为参数。
我已经使用这种方法通过两个数据源成功保存音频:一次来自预先填充的阵列,一次来自流式音频混音,通过我编写的“混音器”来组合音频数据源。后者更像是你需要做的事情。不过,我还没有从麦克风源做到这一点。但据我所知,同样的方法应该有效。