2010-08-18 14 views
12

Estoy construyendo una aplicación que permite a los usuarios tomar fotos usando la cámara del iPhone, y estoy usando AVFoundation cuando está disponible (iOS4) para que los usuarios puedan usar la función tap-to-focus, incluso con una superposición personalizada.Congelar instantáneamente una sesión AVCaptureSession

El problema que estoy teniendo es que captureStillImageAsynchronouslyFromConnection tarda varios segundos en completarse, durante el cual me gustaría imagen fija las imágenes de vídeo principal, así que no es un estado confuso, donde el video es todavía funcionando, pero el usuario ha tomado una foto (y el sonido del obturador de la cámara se ha apagado).

He intentado llamar a [session stopRunning] justo después de solicitar una captura de imagen fija, pero esto conduce a resultados impredecibles; el bloque de finalización de imagen fija a menudo no se dispara en ese caso.

¿Alguna idea sobre cómo podría hacer que la capa de vista previa de video se "pause" tan pronto como se golpea el obturador?

+0

Yo también, he visto otra recomienda desconectar la sesión, a continuación, la cámara es totalmente inestable e inestable. – RainCast

Respuesta

5

Estoy intentando lo mismo. Aunque en mi caso captureStillImageAsynchronouslyFromConnection tardan 0.5 segundos en regresar, ¿entonces quizás esté haciendo algún procesamiento en el controlador de finalización?

Si ese es el caso, me ocurrió con 2 opciones, ambas de las cuales no son suficientes para mí, pero podría hacer por usted

Lo que se me ocurrió es o bien:
* llamar stopRunning en la sesión de captura cuando se llama al controlador de finalización (nuevamente, 0.5 segundos en mi caso), y luego después de procesar la llamada startRunning nuevamente.
* tenga un UIImageView en la parte superior de la plantilla, y almacene la última foto tomada, ya sea desde la cámara o la secuencia de video en esta vista de imagen mientras está procesando.

Lo que me desalentó de ambas soluciones fue que ambas agregan un par de segundos al proceso. Pero espero que ayude o dé una dirección.

Cheers, Oded.

+0

Esta es la respuesta correcta, después de muchos intentos. – RainCast

4

El congelamiento de cuadros simple le da al usuario la impresión de que la imagen en la pantalla ya se ha tomado, lo que es falso — al menos, mostraría una imagen atenuada. Camera.app soluciona el problema cerrando el "obturador".

Es posible que pueda cambiar AVCaptureVideoPreviewLayer alpha a 0.5 para dar la impresión de una imagen atenuada, aunque todavía esté ejecutándose.

Otra opción es utilizar AVCaptureVideoDataOutput y algo de manipulación de imágenes para obtener la imagen fija. Desafortunadamente, no parece posible usar AVCaptureVideoDataOutput y AVCaptureStillImageOutput al mismo tiempo; Una solución alternativa es implementar la funcionalidad de "tomar imágenes" al tomar el siguiente fotograma de video (por supuesto, esto está limitado por la resolución de su video, pero está bien si solo desea hacer procesamiento de imágenes en el fotograma).

0

Respuesta anterior, pero aquí hay una actualización para los curiosos: en iOS5 puede usar un AVCaptureStillImageOutput y un AVCaptureVideoDataOutput al mismo tiempo. Tuve un éxito decente capturando simultáneamente el siguiente fotograma de video y una imagen fija. Utilizo una animación de fundido de salida simple que oculta la interfaz de usuario y luego vuelve a fundirse cuando recupero la imagen de AVCaptureVideoDataOutput.Este proceso es mucho más rápido que esperar la imagen fija a través de AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:completionHandler: muy probablemente debido a las imágenes de menor calidad y menor que salen de AVCaptureVideoDataOutput.

16

Solo necesita configurar su captureVideoPreviewLayer.connection.enabled = NO;

Para más detalles, ver mi respuesta aquí:

AVCaptureSession pause?

+0

ha intentado esto, y conduce a comportamientos extraños en la cámara. – RainCast

+0

Los comportamientos extraños, incluida la toma de una foto que se ve muy azul en color ... a veces muy oscura en la exposición. – RainCast

+0

¿En qué versión de iOS tienes esos comportamientos extraños? – DisableR

Cuestiones relacionadas