Aplicación de efectos a la vista previa de la cámara del iPhone "Video"
Mi objetivo es escribir un controlador de vista de cámara personalizado que:
Puede tomar fotos en las cuatro orientaciones de la interfaz con la parte posterior y, cuando esté disponible, la cámara frontal.Rota y escala correctamente el "video" de vista previa, así como la foto de resolución completa.Permite aplicar un efecto (simple) a AMBOS el "video" de vista previa y la foto de resolución completa.Implementación (en iOS 4.2 / Xcode 3.2.5):
Debido al requisito (3), necesitaba ir a AVFoundation.
Empecé conPreguntas y respuestas técnicas QA1702 e hizo estos cambios:
Cambió el sessionPreset a AVCaptureSessionPresetPhoto.Se agregó un AVCaptureStillImageOutput como salida adicional antes de comenzar la sesión.El problema que tengo es con el rendimiento del procesamiento de la imagen de vista previa (un marco del "video" de vista previa).
Primero, obtengo el resultado UIImage deimageFromSampleBuffer:
en el buffer de muestra decaptureOutput:didOutputSampleBuffer:fromConnection:
. Luego, lo escalo y lo giro para la pantalla usando un CGGraphicsContext.
En este punto, la velocidad de fotogramas ya está por debajo de los 15 FPS que se especifica en la salida de video de la sesión y cuando agrego el efecto, cae por debajo o alrededor de 10. Rápidamente la aplicación se bloquea debido a la poca memoria.
He tenido cierto éxito al reducir la velocidad de cuadros a 9 FPS en el iPhone 4 y 8, FPS en el iPod Touch (4a generación).
También he agregado un código para "vaciar" la cola de despacho, pero no estoy seguro de cuánto realmente está ayudando. Básicamente, cada 8-10 cuadros, se establece una bandera que señalacaptureOutput:didOutputSampleBuffer:fromConnection:
regresar de inmediato en lugar de procesar el marco. El indicador se restablece después de que finaliza una operación de sincronización en la cola de despacho de salida.
En este punto, ni siquiera me importan las bajas velocidades de cuadros, pero obviamente no podemos enviar con los bloqueos de memoria baja. ¿Alguien tiene alguna idea de cómo tomar medidas para evitar las condiciones de poca memoria en este caso (y / o una mejor manera de "vaciar" la cola de envío)?