MediaRecorder.stop() висит с Android 4.0 (ICS)
При вызове stop()
в моей деятельности "Видеозахват" программное обеспечение будет зависать и не вернется к жизни. Только запуск ANR нажатием "Назад" позволит мне убить активность.
Внутри журнала я снова и снова повторяю следующую строку:
W/CameraSource (YYYYY): время ожидания входящего видео камеры рамки: XXXXXX us
Кто-нибудь еще видел это поведение? Любые обходные пути?
Ответы
Ответ 1
Мы слишком долго боролись за эту проблему. Мы только что скопировали код разработчика Android сайт для захвата видео, но приложение зависает до вызова mediarecorder.stop(). После отладки почти по строкам я узнал ff. строка вызывает проблему:
captureButton.setText("start");
Я прокомментировал это, и остановка медиарекордера больше не приведет к ANR. Вместо того, чтобы менять текст кнопки, я просто изменил фон.
captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);
Не видя свой код, я не уверен, есть ли у нас одна и та же причина проблемы, но это исправляет мои. Я все еще ищу, почему это происходит для settext(), а не для setBackgroundResource. Я предполагаю, что это имеет какое-то отношение к фоновой/асинхронной задаче, но это все еще предположение.
Ответ 2
Это также произошло со мной, потому что я снимал камеру перед выполнением stop() на рекордере. В нем также объясняется сообщение об ошибке "Сроки ожидания входящих видеокамер". Он ждет камеры, которая уже выпущена.
Обязательно остановите рекордер - и только затем отпустите камеру:
mMediaRecorder.stop();
mMediaRecorder.release();
camera.stopPreview();
camera.release();
Ответ 3
Я бы рекомендовал вам сделать это в фоновом потоке, чтобы ваше приложение не застревало, даже если метод stop()
блокирует:
new Thread("STOP_RECORDER") {
public void run() {
Log.d(TAG, "Stopping recorder...");
mediaRecorder.stop();
Log.d(TAG, "Recorder successfully stopped");
}
}.start();
Ответ 4
Я случайно отклонил ответ во время обзора, который был задан с помощью "редактирования" вопроса:
user2171513 ответил:
Я столкнулся с той же проблемой, и решение, которое я нашел, это добавить mCamera.lock(); прямо перед mCamera.unlock(); перед установкой камеры в MediaRecorder..
Ответ 5
проверить это -
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
releaseMediaRecorder();
releaseCamera();
}
private void releaseMediaRecorder(){
if (recorder != null) {
recorder.reset(); // clear recorder configuration
recorder.release(); // release the recorder object
recorder = null;
camera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (camera != null){
camera.release(); // release the camera for other applications
camera = null;
}
}
public void stopRecording() { // Toast.makeText(this,"Inside the stop recording",Toast.LENGTH_SHORT).show();
// camera.unlock();
recorder.stop();
// recorder.reset();
recorder.release();#release the recorder after stop important.
}
Ответ 6
У меня также была ошибка. Моя активность содержит мутирующий SurfaceView, который отображает предварительный просмотр, поэтому после начала записи ширина SurfaceView уменьшилась, и я не смог остановить запись, получить ошибку ANR.
Я решаю проблему, исправив измерение SurfaceView. Надеюсь, что это полезно.
Ответ 7
Возможно, вы запускаете предварительный просмотр и рекордер медиа-записи в onCreate(). Переместите это на более позднюю точку или добавьте new Handler.postDelayed(runnable, 1000);
Ответ 8
В моем случае причина в том, что я остановил предварительный просмотр камеры, изменил разрешение предварительного просмотра, а затем перезапустил предварительный просмотр во время записи. Что-то, что будет выглядеть так, если вы скомпилируете все вызовы метода:
camera.startPreview();
camera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setOutputFile(output.getAbsolutePath());
recorder.setPreviewDisplay(holder.getSurface());
recorder.prepare();
recorder.start();
camera.stopPreview();
Camera.Parameters cameraParameters = camera.getParameters();
cameraParameters.setPreviewSize(x, y);
camera.setParameters(cameraParameters);
camera.startPreview();
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
camera.lock();
camera.stopPreview();
В действительности причина изменения размера предварительного просмотра после начала записи была сложной и специфичной для домена, поэтому я сохраню детали. Тем не менее, точка одна и та же: вы не можете изменить размер предварительного просмотра, не останавливая его, но вы не можете остановить предварительный просмотр после запуска медиамагнитофона. Я уверен, что есть другие вещи, которые могут вызвать это, как и любое другое количество параметров камеры.
Вы должны убедиться, что камера не нарушена во время записи видео.
Ответ 9
В моем случае я пытался остановить запись на Activity.onStop
, когда я переместил вызов на MediaRecorder.stop
на Activity.onPause
, он исправил мою проблему.