MediaRecorder.stop () colgando con Android 4.0 (ICS)

Cuando llamo a stop() dentro de mi actividad de captura de vídeo, en ocasiones, el software se bloqueará y no volverá a la vida. Sólo activar una ANR al pulsar "Atrás" me permitirá matar la actividad.

Dentro del registro, veo la línea siguiente repetida una y otra vez:

W / CameraSource (YYYYY): Se ha agotado el tiempo de espera de los fotogramas de vídeo de la cámara entrante: XXXXXX nosotros

¿Alguien más ha visto este comportamiento? ¿Alguna solución?

Hemos estado luchando por este problema durante mucho tiempo también. Acabamos de copiar el código de android desarrollador sitio para la captura de vídeo, pero la aplicación se bloquea antes de mediarecorder.stop () se llama. Al depurar casi línea por línea, descubrí el ff. Línea causa el problema:

 captureButton.setText("start"); 

Lo he comentado y detener el mediarecorder ya no causará una ANR. Lo que hice fue en lugar de cambiar el texto del botón, sólo cambiar el fondo.

 captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main); 

Sin ver su código, no estoy seguro de si tenemos la misma causa del problema, pero esto fija el mío. Todavía estoy buscando por qué sucede esto para settext () y no para setBackgroundResource. Mi conjetura es que tiene algo hacer con la tarea del fondo / async pero sigue siendo una conjetura.

Esto también me pasó porque yo estaba soltando la cámara antes de realizar stop () en la grabadora. También explica el mensaje de error "Tiempo de espera agotado para los fotogramas de vídeo de la cámara entrante". Está esperando una cámara que ya está lanzada. Asegúrese de detener la grabadora – y sólo entonces suelte la cámara:

 mMediaRecorder.stop(); mMediaRecorder.release(); camera.stopPreview(); camera.release(); 

Recomiendo que lo hagas en un hilo de fondo, para que tu aplicación no se quede bloqueada, incluso si el método stop() bloquea:

  new Thread("STOP_RECORDER") { public void run() { Log.d(TAG, "Stopping recorder..."); mediaRecorder.stop(); Log.d(TAG, "Recorder successfully stopped"); } }.start(); 

He rechazado accidentalmente una respuesta durante la revisión que fue dada usando una "edición" de la pregunta:

User2171513 respondió:

Yo estaba enfrentando el mismo problema y la solución que encontré fue añadir mCamera.lock (); Justo antes de mCamera.unlock (); Antes de que la cámara se ajuste en MediaRecorder.

mira esto-

  @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. } 

También tengo un error como este. Mi actividad contiene un SurfaceView mutativo que muestra la vista previa, por lo que después de iniciar la grabación, el ancho de SurfaceView se redujo, y no pude detener la grabación, obtener el error ANR. Sovle el problema por fijar la dimensión de SurfaceView.

Probablemente estás iniciando la vista previa y la grabadora de medios init en onCreate (). Mueva esto a un punto posterior o añada new Handler.postDelayed(runnable, 1000);

En mi caso, la razón por la que sucedió fue que paré la cámara, cambié la resolución de la vista preliminar y luego reinicié la vista previa durante la grabación. Algo que se vería así si compactaba todas las llamadas al método:

 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(); 

En realidad, la razón de que el tamaño de vista previa se cambia después de la grabación comenzó es complicado y específico del dominio, por lo que se guardan los detalles. Sin embargo, el punto es el mismo: no puede cambiar el tamaño de vista previa sin detenerlo, pero no puede detener la vista previa después de que la grabadora de medios haya comenzado. Estoy seguro de que hay otras cosas que podrían causar esto, como cualquier otro número de parámetros de la cámara.

Debe asegurarse de que la cámara no se ve afectada durante la grabación de un vídeo.

En mi caso he estado intentando parar la grabación en Activity.onStop , cuando moví la llamada a MediaRecorder.stop a Activity.onPause fijó mi problema.

  • ¿Cómo puedo pausar la grabación de voz en Android?
  • MediaRecorder se bloquea al iniciar
  • Android: ¿Cómo inicializar MediaRecorder sin una superficie válida para la vista previa de vídeo?
  • Android MediaRecorder produce video corrupto con líneas verdes
  • Android MediaRecorder stop () no se llama
  • Android MediaRecorder y setOutputFile
  • ¿Cómo usar setCamera (MediaRecorder)?
  • ¿Cómo saber si un MediaRecorder está en estado de ejecución o no?
  • Error en MediaRecorder.stop (): -1007
  • En Android, ¿es posible cambiar la cámara (de adelante hacia atrás) y seguir grabando?
  • ¿Cómo recuperar datos al grabarlos y visualizarlos como gráficos (Visualizador) en la pantalla?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.