我想从相机中获取图像的像素。 我正在使用CoreFoundation和OpenGL,我可以渲染图像,但我想做其他一些事情(在其他地方/线程),所以我需要复制它们。
这就是我的尝试:( AVCaptureVideoDataOutputSampleBufferDelegate方法的一部分)
CVImageBufferRef tmpPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress( tmpPixelBuffer, 0 );
//APPROACH A
CFRetain(tmpPixelBuffer);
if(pixelBuffer!= 0) CFRelease(pixelBuffer);
pixelBuffer = tmpPixelBuffer;
//create and bind textureHandle
if(m_textureHandle==0) m_textureHandle = [self _createVideoTextureUsingWidth:videoDimensions.width Height:videoDimensions.width];
glBindTexture(GL_TEXTURE_2D, m_textureHandle);
unsigned char *linebase = (unsigned char *)CVPixelBufferGetBaseAddress( tmpPixelBuffer );
//APPROACH B
unsigned size = videoDimensions.width*videoDimensions.height*4;//since its BGRA
unsigned char *imageData = malloc(size);
memcpy(linebase, imageData, size);
free(imageData);
//map the texture
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoDimensions.width, videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, linebase);
CVPixelBufferUnlockBaseAddress( tmpPixelBuffer, 0 );
在方法A中,我试图保留孔缓冲区,以便稍后在需要时复制像素,但我总是得到一个NULL指针(我不知道为什么)
在方法B中我尝试每次都复制像素,但是我然后opengl渲染器将显示黑色图像。我不知道为什么,我不是在修改原来的缓冲区吗?
提前致谢;)
伊格纳西奥
答案 0 :(得分:0)
在方法B中,在将像素缓冲区复制到其中后立即释放imageData。如果您在调试模式下运行,则内存管理器可能正在清除内存。在任何情况下,在完成数据之前不要调用free()。