簡體   English   中英

MediaRecorder.getMaxAmplitude()始終返回0.0

[英]MediaRecorder.getMaxAmplitude() always returns 0.0

我目前正在android studio中制作一個android應用,該應用需要識別音頻電平何時超過某個閾值。 我目前遇到的問題是MediaRecorder.getMaxAmplitude()函數始終返回0.0。 我見過很多人遇到這個問題,但是沒有一個人得到解決。

我的代碼:

MediaRecorder recorder = new MediaRecorder();

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

    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void stop() {
    try {
        recorder.stop();
        recorder.release();
        recorder = null;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public double getAmplitude() {
    try {
        return recorder.getMaxAmplitude();
    } catch (Exception e) {
        return 0;
    }
}

值得注意的是,stop()函數也無法正常工作,但是在此之前調用getAmplitude()已經不起作用。 我也發現自己返回的不是catch的0,而是實際值。

您可以在啟動記錄器后使用計時器來獲取最大振幅值

public class MainActivity extends AppCompatActivity {

    MediaRecorder mMediaRecorder;

    private int amplitudeValue = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMediaRecorder = new MediaRecorder();
        start(mMediaRecorder);

    }

    public void start(MediaRecorder recorder) {
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile("/dev/null");

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);// will update Max Amplitude Value every 1 second

        try {
            recorder.prepare();
            recorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    private class RecorderTask extends TimerTask { ;
        private MediaRecorder recorder;

        public RecorderTask(MediaRecorder recorder) {
            this.recorder = recorder;
        }

        public void run() {
            runOnUiThread(() -> amplitudeValue = recorder.getMaxAmplitude());
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM