我试图在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());
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只会一直返回0.
看来为了实现这一点,我必须真正开始录制.那是对的吗?
如果是这样,我是否需要录制500ms,获得振幅,停止录制并重复?
最后,我是否必须录制到文件?我不需要保存这个音频文件,我不能只是获取当前幅度或自上次调用当前直播麦克风输入以来没有录音的最高幅度?
任何帮助表示赞赏,谢谢.
我想在java中为麦克风创建一个音频电平表来检查输入的大小.它应该看起来像操作系统之一.我不是在询问gui.它只是计算出来的字节流中的音频电平
n = targetDataLine.read( tempBuffer , 0 , tempBuffer.length );
Run Code Online (Sandbox Code Playgroud)
所以我已经有一些正在运行的东西,但它甚至没有接近我操作系统的水平仪(窗口)它卡在中间.我有0到100之间的值是好的,但在中间音量,无论输入多么大,它都会在60左右.
这是我现在计算的方式:
amplitude = 0;
for (int j = 0; j < tempBuffer.length; j = j +2 ){
if (tempBuffer[j] > tempBuffer[j+1])
amplitude = amplitude + tempBuffer[j] - tempBuffer[j+1];
else amplitude = amplitude + tempBuffer[j + 1] - tempBuffer[j];
}
amplitude = amplitude / tempBuffer.length * 2;
Run Code Online (Sandbox Code Playgroud)
是否有更好/更精确的方法来计算音频电平来监控它?或者我可能犯了一个重大错误?
那是我的Audioformat:
public static AudioFormat getAudioFormat(){
float sampleRate = 20000.0F;
//8000,11025,16000,22050,44100
int sampleSizeInBits = 16;
//8,16
int channels = 1;
//1,2
boolean signed …Run Code Online (Sandbox Code Playgroud)