1
我想從相機中獲取圖像的像素。 我正在使用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);
在方法AI都極力挽留孔緩衝這樣我就可以在需要時以後複製像素,但我總是得到一個空指針(我不知道爲什麼)
在方法BI嘗試每次複製像素,但我然後我opengl呈現器將顯示一個黑色的圖像。我不知道爲什麼,我不修改原始緩衝區?
在此先感謝;)
伊格納西奧
你是對的,但即使我手中的malloc的內存和dealloc方法釋放它,我仍然得到一個黑屏。我已經意識到,如果我在glTexSubImage2D之後放置了方法B,它會渲染幀,但我不知道爲什麼?我沒有處理原始數據。我正在複製它。 – nacho4d 2010-12-11 18:07:12
您對上述memcpy的調用實際上會用新分配的內存覆蓋像素緩衝區的內容。簽名是 void * memcpy(void * destination,const void * source,size_t num); – 2010-12-16 17:05:02