2011-04-11 20 views
5

Obtengo un CVImageBufferRef de mi AVCaptureSession, y me gustaría tomar ese buffer de imagen y subirlo a través de la red. Para ahorrar espacio y tiempo, me gustaría hacer esto sin convertir la imagen en un CIImage y NSBitmapImage, que es la solución que he visto en todas partes (como aquí: How can I obtain raw data from a CVImageBuffer object).datos en bruto de CVImageBuffer sin procesamiento?

Esto se debe a que mi impresión es que el CVImageBuffer podría estar comprimido, lo cual es asombroso para mí, y si lo renderizo, tengo que descomprimirlo en un mapa de bits completo y luego cargar todo el mapa de bits. Me gustaría tomar los datos comprimidos (me doy cuenta de que un solo cuadro comprimido podría no ser renunciar más adelante) así como se encuentra dentro del CVImageBuffer. Creo que esto significa que quiero el puntero de datos base de CVImageBuffer y su longitud, pero no parece que haya una forma de conseguirlo dentro de la API. ¿Alguien tiene ideas?

Respuesta

8

CVImageBuffer es un tipo abstracto. Su imagen debe ser una instancia de CVPixelBuffer, CVOpenGLBuffer o CVOpenGLTexture. La documentación para esos tipos enumera las funciones que puede usar para acceder a los datos.

A decir qué tipo tiene usar los métodos GetTypeID:

CVImageBufferRef image = …; 
CFTypeID imageType = CFGetTypeID(image); 

if (imageType == CVPixelBufferGetTypeID()) { 
    // Pixel Data 
} 
else if (imageType == CVOpenGLBufferGetTypeID()) { 
    // OpenGL pbuffer 
} 
else if (imageType == CVOpenGLTextureGetTypeID()) { 
    // OpenGL Texture 
} 
+0

Bueno, los documentos dicen que CVOpenGLTexture se define en QuartzCore.framework, pero todavía tiene errores de enlace y no pudo construir, ya sea con la OpenGLBuffer o comprobación de OpenGLTexture (también intentado CoreVideo.framework). Afortunadamente, parece que tengo búferes de píxeles, por lo que es un punto discutible. – jab

Cuestiones relacionadas