android:检测声级

时间:2013-01-06 11:00:28

标签: android audio

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

两个问题:

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

3 个答案:

答案 0 :(得分:42)

  1. 使用mRecorder.getMaxAmplitude();

  2. 使用mRecorder.setOutputFile("/dev/null");

  3. 进行声音分析而不保存所需的全部内容

    这是一个例子,我希望这有帮助

    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 :(得分: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

问候!

答案 2 :(得分:3)

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

您可以复制Google的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/ 我需要在BlueTooth上发送声音振幅的值。

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

浏览与MediaRecorder对象相关的部分。