2011-10-13 13 views
6

he implementado una cámara utilizando el marco AVFoundation proporcionada en IOS 4 5 &, pero he estado experimentando un problema incompatibles con la función captureStillImageAsynchronouslyFromConnection:completionHandler: donde el bloque controlador de finalización no se llama. El sonido del obturador no se dispara y la vista previa se congela en esta situación.iOS AVFoundation captureStillImageAsynchronouslyFromConnection: completionHandler: Colgando indefinidamente

He seguido tanto Apple (WWDC 2010 & videos 2011) como las guías que no son de Apple (publicaciones blog y SO) para implementar una captura de imagen fija en resolución de foto con poca o ninguna mejora. He sido capaz de reproducir tanto constantemente bajo las siguientes condiciones :

  • Si fijo parpadea a AVCaptureFlashModeAuto y tomar una foto con poca luz, se cuelga y nunca se ejecuta el bloque de terminación. El flash se dispara, pero el sonido del obturador no. Con el mismo código, puedo tomar una fotografía con luz normal, donde el disparador se dispara, el flash no y el bloque de finalización se ejecuta.
  • Si no configuro flashMode o lo desactivo, puedo tomar algunas fotos, pero después de un número pequeño (entre 1 y 5, por lo general) el bloque de finalización deja de disparar. Para mayor claridad, un escenario podría ser:
    1. tomar una foto y la vista en la pantalla de confirmación
    2. Volver a tener pantalla de fotos
    3. Repetir 1 & 2 un par de veces
    4. Hit tomar una foto y se cuelga antes del bloque de finalización.

Mi Implementación

tengo la interfaz se maneja en un ViewController y clase separada para manejar todas las cosas AVFoundation. Una variable de instancia de la clase separada que maneja las cosas de AVFoundation está en ViewController. Es diferente a las implementaciones de ejemplo, pero no veo por qué debería causar este tipo de error ocasional.

Más observaciones

  • Incluso cuando la comprobación [stillImageOutput isCapturingStillImage], continuará para volver falsa y continuar para ejecutar la función
  • captureStillImageAsynchronouslyFromConnection Si me cambio a otra aplicación, bloquear el teléfono, tomar ciertas acciones en la aplicación, o toque el botón "Tomar foto" un millón de veces, puedo obtener el bloque de finalización para devolver un error. Son diferentes según la acción. Los más comunes son 11800, 11801 y 11830. Parecen no estar relacionados con el hang.
  • He dejado que nuestro teléfono de prueba (iPhone 4 GSM) repose durante una hora para ver si finalmente se procesaría. No dados.

Me encantaría saber si hay algo que me puede estar perdiendo, una propiedad que no se ha solucionado, o un problema conocido con un problema.

Gracias.

(Vi una publicación similar, pero ninguna de las respuestas resolvió mi problema. Necesito Photo res en la aplicación.A modo de referencia: iPhone SDK 4 AVFoundation - How to use captureStillImageAsynchronouslyFromConnection correctly?)

Respuesta

6

Debería haber añadido el código, probablemente lo habría ayudado a cualquiera que vea esto, pero de todos modos:

Resulta que la cámara Flash tiene un impacto bastante significativo en la cantidad de tiempo que se toma procesar la imagen para causar problemas al capturar algo de forma asincrónica. Había terminado accidentalmente la sesión de captura antes de que se enviara la notificación desde el bloque completionHandler.

- (void) saveImageFromCamera { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageCapturedFromCamera) name:@"FTW_imageCaptured" object:nil]; 

    [cameraController captureStillImage]; 
    // WRONG: Session was stopped here before 
} 

- (void) imageCapturedFromCamera { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"FTW_imageCaptured" object:nil]; 

    [sharedAppController setBackgroundImage:[cameraController stillImage]]; 
    sharedAppController.imageFromCamera = YES; 
    [self endCamera]; 
    // CORRECT: Should have stopped session here 

    [self updateBackgroundImage]; 
} 

Espero que esto pueda ayudar a cualquier otra persona que se encuentre con algo como esto.

Cuestiones relacionadas