2011-08-12 10 views
17

al utilizar la implementación de Camera.PreviewCallback se llama al sistema onPreviewFrame sin problema después de iniciar la cámara y comenzar la vista previa (Camera.startPrevew()). El problema es si realizo una grabación de video usando MediaRecorder en PreviewFrame ya no se llama.Cámara onPreviewFrame no llamada

Entiendo que al usar MediaRecorder para grabar video se detiene Camera.PreviewCallback, pero ¿por qué no se puede reiniciar?

He intentado restablecer la devolución de llamada previa de la cámara (setPreviewCallback (callback)) y reiniciar startPreview, pero mientras tengo una vista previa no hay ninguna llamada a onPreviewFrame.

Respuesta

4

usted debe llamar dentro de la nueva instancia de previewCallBacks() de la interfaz, como a continuación

public void surfaceCreated(SurfaceHolder holder) { 
     // if (mediaRecorder == null) { 
     try { 
      camera = Camera.open(); 
      camera.setPreviewCallback(new PreviewCallback() { 
       public void onPreviewFrame(byte[] _data, Camera _camera) { 
       } 
      } 
     } 
} 
1

Es necesario llamar startPreview() de nuevo después de tomar una foto o un vídeo.

12

Debe llamar a setPreviewCallback en el método surfaceChanged, no solo en la superficieCreated.

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
if (mHolder.getSurface() == null){ 
    return; 
} 

try { 
    mCamera.stopPreview(); 
} catch (Exception e){ 
    // ignore: tried to stop a non-existent preview 
} 

try { 
    mCamera.setPreviewCallback(this); 
    mCamera.setPreviewDisplay(mHolder); 
    mCamera.startPreview(); 

} catch (Exception e){ 
    Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
} 
} 
+0

¡Gracias, esto funcionó para mí! – Austin

7

Tuve un problema similar; ver

setOneShotPreviewCallback not hitting onPreviewFrame() in callback

Lo que descubrí fue que después de llamar Camera#unlock() para preparar el MediaRecorder, era necesario llamar Camera#reconnect() antes de la devolución de llamada de vista previa. Esto se debe a que Camera.unlock() separa la cámara del proceso para permitir que se conecte el MediaRecorder.

http://developer.android.com/reference/android/hardware/Camera.html#unlock()

En mis investigaciones he descubierto también que si establece ningún devoluciones de llamada de vista previa utilizando otros métodos que el método de un solo disparo, tiene que restablecer todos ellos después de llamar Camera#reconnect() también. Entonces, brevemente:

mCamera.unlock(); 
//set up MediaRecorder 
mCamera.reconnect(); 
mCamera.setPreviewCallback(mCallback); 
//or whatever callback method you want to use 
//and even if you've set this callback already 

Espero que ayude!

+0

Esto resolvió mi problema. Estaba llamando 'lock()' en lugar de 'reconnect()'. –

Cuestiones relacionadas