gpt4 book ai didi

java - 如何在不录制的情况下在 Android 上对麦克风进行采样以获得实时幅度/电平?

转载 作者:IT老高 更新时间:2023-10-28 23:22:14 26 4
gpt4 key购买 nike

我试图像这样在 Android 上获取麦克风的振幅电平:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);

private class RecorderTask extends TimerTask {
private MediaRecorder recorder;

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

public void run() {
Log.v("MicInfoService", "amplitude: " + recorder.getMaxAmplitude());
}
}

不幸的是,这始终只返回 0。

看来,要让这个工作,我必须真正开始录制。对吗?

如果是这样,我需要记录500ms,获取幅度,停止记录并重复吗?

最后,我必须记录到文件吗?我不需要保存这个音频文件,我不能只获取当前的实时麦克风输入的当前幅度或自上次调用以来的最高幅度而不进行录音吗?

感谢您的帮助。

最佳答案

Toumal 的解决方案有效,但是我无法获得足够高的刷新率来满足我的需求。所以我最终使用了SoundMeter.java Toumal 链接但修改它以使用此 answer 中的代码的类

这是我使用的代码,它提供了更好的刷新率:

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

}

关于java - 如何在不录制的情况下在 Android 上对麦克风进行采样以获得实时幅度/电平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4777060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com