How to sample microphone on Android without recording to get live amplitude/level?

前端 未结 4 466
夕颜
夕颜 2020-12-01 00:39

I was trying to get the amplitude level of a microphone on Android like so:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecord         


        
4条回答
  •  长情又很酷
    2020-12-01 00:48

    The solution from Toumal works, however I wasn't able to get a high enough refresh rate for my needs. So I ended up using the SoundMeter.java class that Toumal linked but modified it to use the code from this answer

    Here is the code I used, which provides a much better refresh rate:

    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    
    public class SoundMeter {
    
        private AudioRecord ar = null;
        private int minSize;
    
        public void start() {
            minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize);
            ar.startRecording();
        }
    
        public void stop() {
            if (ar != null) {
                ar.stop();
            }
        }
    
        public double getAmplitude() {
            short[] buffer = new short[minSize];
            ar.read(buffer, 0, minSize);
            int max = 0;
            for (short s : buffer)
            {
                if (Math.abs(s) > max)
                {
                    max = Math.abs(s);
                }
            }
            return max;
        }
    
    }
    

提交回复
热议问题