2012-01-18 10 views
20

Al llamar al stop() dentro de mi actividad de Video Capture, en ocasiones, el software se bloquea y no volverá a la vida. Solo activar un ANR al presionar "Atrás" me permitirá matar la actividad.MediaRecorder.stop() colgado con Android 4.0 (ICS)

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

W/CameraSource (YYYYY): Se agotó el tiempo de espera para la cámara de vídeo entrante marcos: nos xxxxxx

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

+0

¿podría proporcionarnos algún código de su "actividad de captura de video"? especialmente donde el método stop() se llama – HitOdessit

+0

¿Alguna información adicional sobre esto? Teniendo exactamente el mismo problema aquí. – aaronsnoswell

+0

Por favor ingrese un código. –

Respuesta

0

yo recomiendo que lo hagas en un subproceso en segundo plano, por lo que su aplicación no se atascan, aún cuando el bloque stop() método:

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

accidentalmente me rechazaron una respuesta durante la revisión que era dado usando un 'editar' de la pregunta: ¿

user2171513 respondió:

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

0

la salida 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. 

    } 
+0

Esta respuesta necesita más explicaciones para ser útil. –

5

Hemos estado luchando para este problema desde hace mucho tiempo también. Acabamos de copiar el código del desarrollador de Android site para capturar video, pero la aplicación se cuelga antes de llamar a mediarecorder.stop(). Al depurar casi línea por línea, descubrí el ff. línea de la causa del problema:

captureButton.setText("start"); 

He descomentado y detener el MediaRecorder ya no provocará una ANR. Lo que hice fue cambiar el texto del botón en lugar de cambiar el fondo. Solo cambio 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 corrige el mío. Todavía estoy buscando por qué sucede esto para settext() y no para setBackgroundResource. Mi suposición es que tiene algo que ver con la tarea de fondo/asincrónica, pero todavía es una suposición.

+1

Lo mismo ... Mismo problema para mí ... desacomerdar el setText funcionó para mí. –

0

También recibí un error como este. Mi actividad contiene un SurfaceView mutante que muestra la vista previa, por lo que después de comenzar a grabar, el ancho de SurfaceView se redujo y no pude detener la grabación, obtengo el error ANR Sovlo el problema al corregir la dimensión de SurfaceView. Espero que sea útil

0

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

0

En mi caso, la razón por la que esto sucedió fue que detuve la cámara de prevew, cambié la resolución de vista previa y luego reinicié la vista previa durante la grabación.Algo que sería así si compactado todas las llamadas a métodos:

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 del tamaño de vista previa estaba siendo cambiado después de la grabación comenzó es complicado y dominio específico, así que guardará los datos. Sin embargo, el punto es el mismo: no puede cambiar el tamaño de la 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 comprobar que la cámara no se vea afectada durante la grabación de un video.

3

Esto también me sucedió porque estaba liberando la cámara antes de realizar la detención() en la grabadora. También explica el mensaje de error "Tiempo de espera agotado para los marcos de video de cámara entrantes". Está esperando una cámara que ya se lanzó. Asegúrese de parar la grabación - y sólo después suelte la cámara:

mMediaRecorder.stop(); 
mMediaRecorder.release(); 

camera.stopPreview(); 
camera.release(); 
+0

Gracias por la respuesta. Estuve luchando por resolver eso durante 2 días. – aacanakin

0

En mi caso he estado tratando de detener la grabación en Activity.onStop, cuando me mudé a la llamada MediaRecorder.stop a Activity.onPause lo arreglen mi problema.

Cuestiones relacionadas