MediaRecorder выдает ошибку запуска или IllegalStateException
Я использую MediaRecorder для записи видео через API камеры Android. Я застрял с очень странной проблемой.
private void startRecordingVideo() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
File file = getAlbumDir();
recorder.setOutputFile(file.getAbsolutePath());
recorder.setMaxDuration(50000);
recorder.setMaxFileSize(5000000);
recorder.setPreviewDisplay(CameraBridgeViewBase.surfaceHolder.getSurface());
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
Теперь это дает мне MediaRecorder: запуск не удалось: -19 ошибка. Я проверил эту и эту ссылки, которые говорят, чтобы удалить mediaRecorder.setVideoSize(sView.getWidth(), sView.getHeight());
но я не использовалsetVideoSize(sView.getWidth(), sView.getHeight())
, При попытке и ошибке я обнаружил, что если я удаляю кодировщики recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
а также recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
приложение не падает, но выдает новое исключение как:
03-23 16:50:06.213 28226-28226/com.scenera.android.surveillance E/MediaRecorder: audio source is set, but audio encoder is not set
Я не понимаю, что я делаю здесь не так. Любая помощь будет оценена. Заранее спасибо.
2 ответа
Проблема в том, что вы не настраиваете камеру, используя API-интерфейс Camera 1, вы должны сначала открыть камеру, затем разблокировать ее и установить на рекордер. Только после этого вы можете продолжить настройку MediaRecorder
(что, кстати, очень красиво написано API)
MediaRecorder recorder = new MediaRecorder();
Camera camera = Camera.open();
camera.unlock();
recorder.setCamera(camera);
recorder.setPreviewDisplay(surfaceHolder.getSurface());
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
File file = getAlbumDir();
recorder.setOutputFile(file.getAbsolutePath());
recorder.setMaxDuration(50000);
recorder.setMaxFileSize(5000000);
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
boolean mStartRecording=false;
сначала создайте эту переменную в упражнении, а затем попробуйте следующий код
if( recorder == null ) {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
File file = getAlbumDir();
recorder.setOutputFile(file.getAbsolutePath());
recorder.setMaxDuration(50000);
recorder.setMaxFileSize(5000000);
recorder.setPreviewDisplay(CameraBridgeViewBase.surfaceHolder.getSurface());
}
if(!mStartRecording) {
try {
recorder.prepare();
recorder.start();
mStartRecording = true;
} catch (IOException e) {
e.printStackTrace();
}
} else {
mStartRecording = false;
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
}
попробуйте это и дайте мне знать, если это работает.