我从我的AVCaptureSession获得了一个CVImageBufferRef,我想带上那个图像缓冲区并通过网络上传它。为了节省空间和时间,我想这样做而不将图像渲染成CIImage和NSBitmapImage,这是我在各处看到的解决方案(例如:How can I obtain raw data from a CVImageBuffer object)。
这是因为我的印象是CVImageBuffer可能会被压缩,这对我来说很棒,如果我渲染它,我必须将其解压缩为完整的位图,然后上传整个位图。我想获取压缩数据(意识到单个压缩帧可能在以后自身无法实现),就像它位于CVImageBuffer中一样。我想这意味着我想要CVImageBuffer的基本数据指针及其长度,但它似乎没有办法在API中获得它。有人有什么想法吗?
答案 0 :(得分: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
}