2010-11-21 15 views

Respuesta

19

A partir de iOS 4.0, puede usar AVCaptureDeviceInput para obtener la cámara como una entrada de dispositivo y conectarla a un AVCaptureVideoDataOutput con cualquier objeto que desee establecer como el delegado. Al establecer un formato BGRA de 32 ppp para la cámara, el objeto delegado recibirá cada fotograma de la cámara en un formato perfecto para pasar inmediatamente al glTexImage2D (o glTexSubImage2D si el dispositivo no es compatible con texturas que no sean de potencia de dos; creo que los dispositivos MBX entran en esta categoría).

Existen varias opciones de tamaño de fotograma y velocidad de fotogramas; supongo que tendrá que ajustar esos dependiendo de cuánto más desee usar la GPU. Descubrí que una escena completamente trivial con solo un cuadrilátero texturizado que muestra el último fotograma, redibujado solo exactamente cuando llega un nuevo fotograma en un iPhone 4, fue capaz de mostrar la alimentación máxima de 720p a 24 fps de ese dispositivo sin ningún retraso notable. No he realizado una evaluación comparativa más exhaustiva que esa, así que espero que alguien más pueda aconsejarme.

En principio, según la API, los marcos pueden volver con algunos rellenos en memoria entre las líneas de exploración, lo que significaría una mezcla de contenidos antes de publicar en GL, por lo que es necesario implementar una ruta de código. En la práctica, hablando de forma puramente empírica, parece que la versión actual de iOS nunca devuelve imágenes en esa forma, por lo que no es realmente un problema de rendimiento.

EDITAR: ahora es muy cerca de tres años después. Mientras tanto, Apple lanzó iOS 5, 6 y 7. Con 5 introdujeron CVOpenGLESTexture y CVOpenGLESTextureCache, que ahora son la forma inteligente de canalizar video desde un dispositivo de captura a OpenGL. Apple suministra el código de muestra here, del cual las piezas particularmente interesantes se encuentran en RippleViewController.m, específicamente sus setupAVCapture y captureOutput:didOutputSampleBuffer:fromConnection: - vea las líneas 196-329. Desgraciadamente, los términos y condiciones para evitar la duplicación del código aquí sin asociar todo el proyecto, pero la configuración paso a paso es:

  1. crear un CVOpenGLESTextureCacheCreate y un AVCaptureSession;
  2. obtenga un adecuado AVCaptureDevice para video;
  3. crear un AVCaptureDeviceInput con ese dispositivo de captura;
  4. adjunte un AVCaptureVideoDataOutput y dígale que lo llame como un delegado de buffer de muestra.

Al recibir cada tampón de muestra:

  1. obtener el CVImageBufferRef de ella;
  2. use CVOpenGLESTextureCacheCreateTextureFromImage para obtener Y y UV CVOpenGLESTextureRef s del buffer de imagen CV;
  3. obtener objetivos de textura y nombres de las referencias de textura de CV OpenGLES para enlazarlos;
  4. combinan la luminancia y la crominancia en su sombreador.
+0

Gracias por la respuesta. Lo cavaré – Eonil

+1

Son solo unas 200 líneas para unir todo; Lo siento por no publicar el código. He abordado el problema solo mientras estaba en el trabajo, por lo que no puedo publicar lo que tengo. Pero es realmente algo trivial y definitivamente pasé mucho más tiempo averiguando cuáles eran las clases apropiadas en la documentación de las que codificaba. – Tommy

+0

@Eonil Si le gusta su respuesta, márquela como la respuesta aceptada. – pr1001

0

Uso RosyWriter para un mejor ejemplo de cómo hacer el procesamiento de vídeo OpenGL. El rendimiento es muy bueno, especialmente si reduces la velocidad de fotogramas (~ 10% a 1080P/30,> = 5% a 1080P/15.

Cuestiones relacionadas