我目前正在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,而是实际的值。
发布于 2018-06-26 07:25:04
您可以在启动录音机后使用计时器获取最大幅度值
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());
}
}
}
https://stackoverflow.com/questions/51024727
复制相似问题