В настоящее время я создаю приложение для Android в студии 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 () уже не работает. Также я сам понял, что возвращается не 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());
}
}
}
Хорошо, в конце концов я получил это! Была ошибка, которая заключалась в том, что я сделал два регистратора, один в области класса и один в start (). Но это было не единственное решение. Мне также пришлось инициализировать функцию getMaxAmplitude, вызвав ее в функции запуска после рекордера.start ().
Спасибо за ваше время, но лямбда-выражение не подходит для среды Android. Кроме того, функция вызывается 30 раз в секунду через другую временную задачу, поэтому, если я правильно понимаю, это должно работать так же.