[英]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.