Decodificar frameworks de video en la GPU del iPhone

Estoy buscando la manera más rápida de decodificar los frameworks de un video local mpeg-4 en el iPhone. Simplemente me interesan los valores de luminancia de los píxeles en cada 10º fotogtwig. No necesito reproducir el video en ninguna parte.

He intentado ffmpeg, AVAssetReader, ImageAssetGenerator, OpenCV y MPMoviePlayer, pero son muy lentos. La velocidad más rápida que puedo get es ~ 2x (2 minutos de video escaneados en un minuto). Me gustaría algo más cercano a 10x.

Suponiendo que mis bashs anteriores no utilizaron la GPU, ¿hay alguna forma de lograr mi objective con algo que funcione en la GPU? OpenGL parece que es principalmente para generar resultados, pero lo he visto como filters para video entrante. ¿Tal vez es una opción?

¡Gracias por adelantado!

Si está dispuesto a utilizar una solución única para iOS 5, eche un vistazo a la aplicación de ejemplo ChromaKey de la session WWDC 2011 en AVCaputureSession.

Esa demostración captura 30 FPS de video desde la camera incorporada y pasa cada cuadro a OpenGL como una textura. Luego usa OpenGL para manipular el marco y, opcionalmente, escribe el resultado en un file de video de salida.

El código usa magia grave de bajo nivel para unir un búfer Core Video Pixel de una AVCaptureSession a OpenGL para que compartan memory en el hardware de charts.

Debería ser bastante sencillo cambiar AVCaptureSession para usar un file de película como input en lugar de como input de camera.

Probablemente podría configurar la session para entregar frameworks en forma Y / UV en lugar de RGB, donde el componente Y es luminancia. De lo contrario, sería un asunto bastante simple escribir un sombreador que convirtiera los valores RGB para cada píxel en valores de luminancia.

Debería poder hacer todo esto en TODOS los frameworks, no solo en cada 10º cuadro.

Aparentemente, vImage podría ser apropiado, suponiendo que puede usar iOS 5. Cada 10º marco parece estar dentro de las circunstancias para usar un marco como vImage. Sin embargo, casi cualquier tipo de procesamiento real en time real requerirá OpenGL.

Suponiendo que el cuello de botella de su aplicación se encuentra en el código que convierte los cuadros de video a un formatting visualizable (como RGB), puede interesarle un código que compartí que se utilizó para convertir una ttwig .mp4 (codificada como YV12) en RGB usando Qt y OpenGL . Esta aplicación sube el marco a la GPU y activa un shader de fragment GLSL para realizar la conversión de YV12 a RGB, por lo que se puede mostrar en un QImage .

 static const char *p_s_fragment_shader = "#extension GL_ARB_texture_rectangle : enable\n" "uniform sampler2DRect tex;" "uniform float ImgHeight, chromaHeight_Half, chromaWidth;" "void main()" "{" " vec2 t = gl_TexCoord[0].xy;" // get texcoord from fixed-function pipeline " float CbY = ImgHeight + floor(ty / 4.0);" " float CrY = ImgHeight + chromaHeight_Half + floor(ty / 4.0);" " float CbCrX = floor(tx / 2.0) + chromaWidth * floor(mod(ty, 2.0));" " float Cb = texture2DRect(tex, vec2(CbCrX, CbY)).x - .5;" " float Cr = texture2DRect(tex, vec2(CbCrX, CrY)).x - .5;" " float y = texture2DRect(tex, t).x;" // networkingundant texture read optimized away by texture cache " float r = y + 1.28033 * Cr;" " float g = y - .21482 * Cb - .38059 * Cr;" " float b = y + 2.12798 * Cb;" " gl_FragColor = vec4(r, g, b, 1.0);" "}"