android: Detect sound level

前端 未结 3 1648
忘了有多久
忘了有多久 2020-11-27 10:52

Using MediaRecorder I capture sound from device\'s microphone. From the sound I get I need only to analyze the sound volume (sound loudness), without saving the

相关标签:
3条回答
  • 2020-11-27 11:24
    1. Use mRecorder.getMaxAmplitude();

    2. For the analysis of sound without saving all you need is use mRecorder.setOutputFile("/dev/null");

    Here´s an example, I hope this helps

    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;
    
        }
    }
    
    0 讨论(0)
  • 2020-11-27 11:37

    If you want to analyse a sample of sound taken directly from the microphone without saving the data in a file, you need to make use of the AudioRecord Object as follows:

    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);
    }
    

    Then you have to start recording when ready:

    audio.startRecording();
    

    Now it's time to start reading samples as follows:

    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));
    

    The last code combines all the different samples amplitudes and assigns the average to the lastLeveL variable, for more details you can go to this post.

    Regards!

    0 讨论(0)
  • 2020-11-27 11:39

    I played around with a few sound recording source code apps but it took a while to get it.

    You can copy Google's NoiseAlert source code - the SoundMeter code, which is what I've used.

    getMaxAmplitude ranges from 0 to 32768. The EMA stuff I didn't bother using.

    In your main activity, you have to declare a MediaRecorder object and call its start() function as Anna quoted.

    For more info, you can refer to my project: 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/ Where I needed to send the value of the sound amplitude over BlueTooth.

    Exact code is here: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

    Just skim through the parts that have anything to do with the MediaRecorder object associated.

    0 讨论(0)
提交回复
热议问题