iphone - Cómo aplicar "filtros" a AVCaptureVideoPreviewLayer
avfoundation avcapturesession (2)
Probablemente la forma más eficaz de manejar esto sea usar OpenGL ES para filtrar y mostrar estos cuadros de video. No podrá hacer mucho con un AVCaptureVideoPreviewLayer directamente, además de ajustar su opacidad cuando se superpone con otra vista o capa.
here tengo una aplicación de muestra en la que tomo fotogramas de la cámara y uso los sombreadores OpenGL ES 2.0 para procesar el video en tiempo real y mostrarlo. En esta aplicación (explicada en detalle here ), estaba usando el filtrado basado en colores para rastrear objetos en la vista de la cámara, pero otros han modificado este código para hacer algunos buenos efectos de procesamiento de video. Todos los filtros basados en GPU en esta aplicación que se muestran en la pantalla funcionan a 60 FPS en mi iPhone 4.
El único dispositivo iOS que admite video, pero que no tiene una GPU compatible con OpenGL ES 2.0, es el iPhone 3G. Si necesita enfocarse también en ese dispositivo, es posible que pueda tomar el código base para la captura de video y la generación de texturas OpenGL ES, y luego usar el código de filtro de la aplicación de ejemplo GLImageProcessing de Apple. Esa aplicación se basa en OpenGL ES 1.1, soporte que está presente en todos los dispositivos iOS.
Sin embargo, recomiendo consultar el uso de OpenGL ES 2.0 para esto, ya que puede obtener muchos más tipos de efectos utilizando sombreadores que con la línea fija OpenGL ES 1.1.
(Editar: 13/02/2012) Como una actualización de lo anterior, ahora he creado un marco de código abierto llamado GPUImage que encapsula este tipo de filtrado de imagen personalizado. También maneja la captura de video y su visualización en la pantalla luego de ser filtrada, lo que requiere tan solo seis líneas de código para configurar todo esto. Para obtener más información sobre el marco, puede leer mi anuncio más detallado .
Mi aplicación actualmente está utilizando AVFoundation para tomar los datos brutos de la cámara desde la cámara trasera de un iPhone y mostrarlos en un AVCaptureVideoPreviewLayer en tiempo real.
Mi objetivo es aplicar condicionalmente filtros de imagen simples a la capa de vista previa. Las imágenes no se guardan, así que no necesito capturar la salida. Por ejemplo, me gustaría alternar una configuración que convierta el video que entra en la capa de vista previa a Blanco y Negro.
Encontré here una pregunta que parece lograr algo similar al capturar los marcos de video individuales en un búfer, aplicar las transformaciones deseadas y luego mostrar cada fotograma como un UIImage. Por varias razones, esto parece excesivo para mi proyecto y me gustaría evitar cualquier problema de rendimiento que esto pueda causar.
¿Es esta la única manera de lograr mi objetivo?
Como mencioné, no estoy buscando capturar ninguno de los videos de AVCaptureSession, simplemente hacer una vista previa.
Yo recomendaría mirar el ejemplo de Rosy Writer de la biblioteca de desarrollo ios. La biblioteca de GPUImage de Brad Larson es bastante impresionante, pero parece un poco exagerado para esta pregunta.
Si solo está interesado en agregar OpenGL Shaders (también conocidos como filtros) a AVCaptureVideoPreviewLayer
el flujo de trabajo es enviar la salida de la sesión de captura a una vista de OpenGL para su renderizado.
AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
videoOut.videoSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(_renderer.inputPixelFormat) };
[videoOut setSampleBufferDelegate:self queue:_videoDataOutputQueue];
Luego, en captureOutput:
delegate envía el buffer de muestra a OpenGL Renderer
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVPixelBufferRef sourcePixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
_renderer copyRenderedPixelBuffer:sourcePixelBuffer];
}
En OpenGL Renderer, adjunta sourcePixelBuffer
a una textura y puedes filtrarlo dentro de los sombreadores OpenGL. El sombreador es un programa que se ejecuta en una base de píxeles. El ejemplo de Rosy Writer también muestra ejemplos del uso de diferentes técnicas de filtrado además de OpenGL.