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

前端 未结 4 458
夕颜
夕颜 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 01:11

    You can also use mediaRecoder class, to display real time data on UI you need to use Handler:

    public class SoundMeter {
    private MediaRecorder mediaRecorder;
    public  void start(){
        if(started){
            return;
        }
        if (mediaRecorder == null){
            mediaRecorder = new MediaRecorder();
    
            mediaRecorder.setAudioSource(
                    MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(
                    MediaRecorder.OutputFormat.THREE_GPP);
            mediaRecorder.setAudioEncoder(
                    MediaRecorder.AudioEncoder.AMR_NB);
            mediaRecorder.setOutputFile("/dev/null");
    
            try{
                mediaRecorder.prepare();
            }catch (IllegalStateException e){
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }
            mediaRecorder.start();
            started = true;
        }
    }
    
    }
    public double getAmplitude(){
        return  mediaRecorder.getMaxAmplitude();
    }
    }
    

    This part show data on UI:

        private Runnable pollTask = new Runnable() {
        @Override
        public void run() {
            double amplitude = soundMeter.getAmplitude();
            amplitudeTextView.setText("Amplitude: " + amplitude);
    
            handler.postDelayed(pollTask, 500);
        }
    };
    

    Don't forget to call handler in onCreate method:

    handler.postDelayed(pollTask, 500);
    

    500 is delay in milliseconds which UI will updated

    as you can see here you don't need to save output to file if you set output destination as below it won't save anywhere:

    mediaRecorder.setOutputFile("/dev/null");
    

提交回复
热议问题