首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MediaRecorder.getMaxAmplitude()总是返回0.0

MediaRecorder.getMaxAmplitude()总是返回0.0
EN

Stack Overflow用户
提问于 2018-06-25 21:31:13
回答 1查看 726关注 0票数 0

我目前正在android studio中制作一个android应用程序,它需要识别音频水平何时超过某个阈值。我目前遇到了MediaRecorder.getMaxAmplitude()函数总是返回0.0的问题。我见过很多人都有这个问题,但他们都没有得到解决。

我的代码:

代码语言:javascript
复制
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,而是实际的值。

EN

回答 1

Stack Overflow用户

发布于 2018-06-26 07:25:04

您可以在启动录音机后使用计时器获取最大幅度值

代码语言:javascript
复制
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());
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51024727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档