我正在构建一个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)或任何其他有用单位,则将是首选方法。

最佳答案

没有一种简单的方法可以解释getMaxAmplitude()的输出,因为它只会为您的手机的特定硬件提供最大的值(value)。不幸的是,制造商符合Android OS要求这一事实并不能确保您从每个麦克风获得相同的响应。事实上,即使来自同一制造商的所有设备也不都具有相同类型的麦克风,因此您不会获得相同的频率响应或灵敏度。如果要从此附加(但与硬件相关的声音强度成比例)单位转换为dB,则返回getMaxAmplitude(),只需使用dB = 20log10(getMaxAmplitude())即可。现在,如果您希望此方法适用于各种设备,我建议您在应用程序中包括一个校准台,以便您可以设置一个取决于设备的动态阈值,而不是一个绝对值。也许可以将阈值设置为校准时获得的强度与尝试捕获时获得的强度之间的关系。我不知道您的应用程序的细节,但是如果我是您,那么我至少要牢记这两个方面中的一个。麦克风输入最充分,最饱和的那一刻(也许您可以从扬声器产生自己的大声声音并进行记录)

08-05 13:23