android - 如何分析Android中mediaRecorder.getMaxAmplitude()返回的值

标签 android audio signal-processing noise

我正在构建一个 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() 的输出,因为它只会为您提供手机特定硬件获得的最大值。不幸的是,制造商符合 Android 操作系统要求这一事实并不能确保您从每个麦克风获得相同的响应。事实上,即使来自同一制造商的所有设备都没有相同类型的麦克风,因此您不会获得相同的频率响应或灵敏度。如果您想从 getMaxAmplitude() 返回的这个辅助(但取决于硬件的声音强度比例)单位转换为 dB,只需使用 dB = 20log10(getMaxAmplitude())。现在,如果您希望它适用于各种设备,我建议您在您的应用程序中包含一个校准阶段,以便您可以设置动态设备相关阈值而不是绝对值。也许您可以将阈值设置为校准时获得的强度与 try catch 时获得的强度之间的关系。我不知道您的应用程序的具体细节,但如果我是您,我至少会考虑这两件事中的一件来进行比较。麦克风输入最安静和最饱和的时刻(也许您可以从扬声器中产生自己的响亮声音并记录下来)

关于android - 如何分析Android中mediaRecorder.getMaxAmplitude()返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37556028/

相关文章:

java - 在 Android 上存储加密 key

java - Android 中的 SQLite OpenDatabase 问题

javascript - 如何在 Javascript 中重播 Audio-Blob?

python - 使用 python + 元数据读写立体声 .wav 文件

python - 如何使用python获取声音包络

java - 从动态创建的多个 EditText 读取文本时出错

android - 找不到符号类数据绑定(bind) impl

python - FFT求自相关函数

javascript - 如何在nodejs中播放存储在Buffer中的音频?

android - 解码的AAC声音为AudioTrack奇怪的声音