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:
- Problema de MediaRecorder en Android Lollipop
- ¿Por qué `` OnInfoListener` de MediaRecorder no se llama en código inferior cuando se alcanza el tamaño máximo de archivo
- Android - Cómo iniciar la grabación de vídeo automáticamente cuando se llama a la cámara intención
- Necesita un ejemplo sencillo para la grabación de audio
- MediaRecorder Audio Delay
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?
- Grabar audio con MediaRecorder y reproducir simultaniosamente con MediaPlayer
- ¿Cómo transmitir flujo de la videocámara a través de la red, la producción de archivo de vídeo válido, utilizando Android?
- MediaRecorder setVideoSize muestra un comportamiento diferente en diferentes dispositivos
- Mediarecorder Android sólo grabar video de calidad terrible
- Android: Dos instancias de Media Recorder al mismo tiempo
- Cómo reducir el tamaño del archivo mp3 en Android creado con MediaRecorder
- MediaRecorder.stop () se cuelga en la cámara Samsung Galaxy
- Obtener el codec compatible para el dispositivo Android
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.
- Utilice una caja de diapositivas (como en el marco iónico) en la aplicación nativa de Android con ViewPager
- ¿Cómo puedo recibir notificaciones múltiples usando GCM sin reemplazar la precedente?