2011-04-11 87 views
5

我从我的AVCaptureSession获取CVImageBufferRef,并且想要将该图像缓冲区上传到网络上。为了节省空间和时间,我希望在不将图像渲染成CIImage和NSBitmapImage的情况下执行此操作,这是我在处处看到的解决方案(如:How can I obtain raw data from a CVImageBuffer object)。从CVImageBuffer原始数据没有呈现?

这是因为我的印象是CVImageBuffer可能是压缩的,这对我来说很棒,如果我渲染它,我必须将它解压缩成完整的位图,然后上传整个位图。我想采用压缩的数据(意识到单个压缩帧本身后来可能无法修改),就像它位于CVImageBuffer中一样。我认为这意味着我需要CVImageBuffer的基本数据指针及其长度,但它没有出现在API中获取它的方法。任何人有任何想法?

回答

8

CVImageBuffer本身是一种抽象类型。您的图片应该是CVPixelBuffer,CVOpenGLBuffer或CVOpenGLTexture的实例。这些类型的文档列出了可用于访问数据的功能。

知道哪些类型是否使用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

好了,文档说CVOpenGLTexture在QuartzCore.framework定义,但我仍然有链接错误,无法与任OpenGLBuffer建设或OpenGLTexture检查(也尝试过CoreVideo.framework)。幸运的是,我似乎有像素缓冲区,所以这是一个有争议的问题。 – jab 2011-04-12 19:59:55