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.

  • MediaRecorder.stop () se cuelga en la cámara Samsung Galaxy
  • ¿Cómo usar setCamera (MediaRecorder)?
  • ¿Por qué Camera necesita ser lanzado en onPause () en lugar de onstop () método de Activity?
  • En Android, ¿es posible cambiar la cámara (de adelante hacia atrás) y seguir grabando?
  • Uso de MediaPlayer para reproducir un archivo AMR creado por MediaRecorder falla con muri null
  • ¿Por qué `` OnInfoListener` de MediaRecorder no se llama en código inferior cuando se alcanza el tamaño máximo de archivo
  • Error en MediaRecorder.stop (): -1007
  • Problema de MediaRecorder en Android Lollipop
  • El video grabado con Android MediaRecorder está dañado en el Samsung Galaxy S2
  • Grabe vídeo con un tamaño de vista previa diferente al del archivo de vídeo resultante
  • Android Video Recording de la superficie de OpenGL (GLSURFACEVIEW)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.