我正在构建一个Android应用程序,应该在录制的声音超过某个阈值时开始录制音频。
我研究并发现MediaRecorder类的方法getMaxAmplitude()给出了噪声响度的估计值,作为声压的度量。它返回0到+32767之间的值。
这是我写的代码。
MediaRecorder mediaRecorder = new MediaRecorder();
while(True){
if (mediaRecorder.getMaxAmplitude() > THRESHOLD)
System.out.println("Recording sound");
else
System.out.println("Sound recording not above the threshold level);
}
我无法计算出THRESHOLD值,因为getMaxAmplitude()函数返回的值没有标准单位。如果有人可以建议从getMaxAmplitude()函数返回的值到分贝(dB)或任何其他有用单位的转换,那将是首选。
答案 0 :(得分:3)
没有简单的方法可以解释getMaxAmplitude()
的输出,因为它只会为您提供手机特定硬件的最大价值。不幸的是,制造商符合Android操作系统要求这一事实并不能确保您从每个麦克风获得相同的响应。事实上,即使是同一制造商的所有设备都没有相同类型的麦克风,因此您也无法获得相同的频率响应或灵敏度。如果要从此adimentional(但依赖于硬件的声音强度比例)单位getMaxAmplitude()
返回转换为dB,只需使用dB = 20log10(getMaxAmplitude())
。现在,如果您希望将其用于各种设备,我建议您在应用程序中包含校准阶段,以便设置动态设备相关阈值而不是绝对值。也许您可以将阈值设置为校准时获得的强度与您尝试捕获的强度之间的关系。我不知道你的应用程序的具体细节,但如果我是你,我至少会考虑这两件事中的一件来进行比较。麦克风输入最完整且最饱和的时刻(也许你可以从扬声器产生你自己的响亮声音并记录下来)