2013-01-06 121 views
24

使用MediaRecorder我从设备的麦克风捕捉声音。从我得到的声音中,我只需要分析音量(声音响度),而不将声音保存到文件中。android:检测声音水平

两个问题:

  1. 我如何获得的声音响度在给定时刻?
  2. 如何在不将声音保存到文件的情况下进行分析?

谢谢。

回答

35
  1. 使用mRecorder.getMaxAmplitude();

  2. 对于声音的分析,不保存所有你需要的是使用mRecorder.setOutputFile("/dev/null");

Here's一个例子,我希望这有助于

public class SoundMeter { 

    private MediaRecorder mRecorder = null; 

    public void start() { 
      if (mRecorder == null) { 
        mRecorder = new MediaRecorder(); 
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
        mRecorder.setOutputFile("/dev/null"); 
        mRecorder.prepare(); 
        mRecorder.start(); 
      } 
    } 

    public void stop() { 
      if (mRecorder != null) { 
        mRecorder.stop();  
        mRecorder.release(); 
        mRecorder = null; 
      } 
    } 

    public double getAmplitude() { 
      if (mRecorder != null) 
        return mRecorder.getMaxAmplitude(); 
      else 
        return 0; 

    } 
} 
+1

我喜欢/ dev/null,但我不明白如何每秒获得MaxAmplitude几次。 –

+1

我需要连续记录声压级(每秒100次)。录制的声音级别(响度)应该从我录制它的那一刻开始。 –

+0

我解决了。 getMaxAmplitude()返回值在android开发网站上是这样解释的:自上次调用以来测得的最大绝对幅度,或者当第一次调用时为0,并且获得任何秒数这个值我使用了一个Timer。 –

3

我玩了几个录音源代码应用程序,但它好一段时间才能得到它。

您可以复制谷歌的NoiseAlert源代码 - SoundMeter代码,这是我用过的。

getMaxAmplitude范围从0到32768. EMA的东西,我没有打扰使用。

在你的主要活动中,你必须声明一个MediaRecorder对象,并按Anna的引用调用它的start()函数。

欲了解更多信息,你可以参考我的项目: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-i-e-how-to-transmit-send-data-from-android-to-arduino-bluesmirf-silver-using-bluetooth/ 地方,我需要发送声音振幅通过蓝牙的价值。

确切的代码是在这里:https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

通过有什么关联的MediaRecorder对象的部分只是走马观花。

+0

该网页http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send-data-from-android-to-arduino-根据WordPress的说法,bluesmirf-silver-using-bluetooth“不再可用”。 –

6

如果要分析直接从话筒取声音的样品没有在文件中保存数据,您需要使用AudioRecord对象如下:

int sampleRate = 8000; 
try { 
    bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO, 
     AudioFormat.ENCODING_PCM_16BIT); 
    audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
} catch (Exception e) { 
    android.util.Log.e("TrackingFlow", "Exception", e); 
} 

然后,你必须开始录制准备时:

audio.startRecording(); 

现在是时候开始读取样本如下:

short[] buffer = new short[bufferSize]; 

    int bufferReadResult = 1; 

    if (audio != null) { 

     // Sense the voice... 
     bufferReadResult = audio.read(buffer, 0, bufferSize); 
     double sumLevel = 0; 
     for (int i = 0; i < bufferReadResult; i++) { 
      sumLevel += buffer[i]; 
     } 
     lastLevel = Math.abs((sumLevel/bufferReadResult)); 

最后一个代码组合了所有不同的采样幅度,并将平均值分配给lastLeveL变量,有关更多详细信息,请参阅此post

问候!

+0

此算法已损坏 - 您无法将这些值加起来,因为这些值都是有符号值。你必须采取*幅度*和平均值。 –

+0

@Martin:“lastLevel”是MaxAmplitude?其实我需要计算'dbValue'和'MeanLevelTotal'的值,并且我没有使用预先录制的文件。我正在进行现场录音。 –