我試圖提取從攝像機接收像素緩衝區的YUV數據,然後重新創建一個像素緩衝區,但我在CVOpenGLESTextureCacheCreateTextureFromImage得到-6683,文檔只是說,約CVOpenGLESTextureCacheCreateTextureFromImage問題
The pixel buffer is not compatible with OpenGL due to an unsupported buffer size, pixel format, or attribute.
哪些呢沒有太大的幫助。我該如何解決它?如下面的代碼:
- (void)Init
{
*****;
OSStatus err = CMBufferQueueCreate(kCFAllocatorDefault, 1, CMBufferQueueGetCallbacksForUnsortedSampleBuffers(), &previewBufferQueue);
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
OSStatus err = CMBufferQueueEnqueue(previewBufferQueue, sampleBuffer);
if (!err) {
dispatch_async(dispatch_get_main_queue(), ^{
CMSampleBufferRef sbuf = (CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);
if (sbuf) {
CVImageBufferRef pixBuf = CMSampleBufferGetImageBuffer(sbuf);
[self.delegate displayPixelBuffer:pixBuf];
CFRelease(sbuf);
}
});
}
}
的displayPixelBuffer方法:
-(void)displayPixelBuffer:(CVImageBufferRef)pixelBuffer
{
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
size_t planeWidth[2] = {CVPixelBufferGetWidthOfPlane(pixelBuffer, 0), width};
size_t planeHeight[2] = {CVPixelBufferGetHeightOfPlane(pixelBuffer, 0),
CVPixelBufferGetHeightOfPlane(pixelBuffer, 1)};
size_t planeBytesPerRow[2] = {CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0), width/2};
unsigned char *YUV2[2] = {0};
YUV2[0] = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
YUV2[1] = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);
CVReturn renturn = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
0,
0,
2,
(void *)YUV2,
planeWidth,
planeHeight,
planeBytesPerRow,
nil,
nil, nil, &imageBuffer);
glActiveTexture(GL_TEXTURE0);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
imageBuffer,
NULL,
GL_TEXTURE_2D,
GL_LUMINANCE,
width,
height,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
0,
&texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
return;
}
glBindTexture(CVOpenGLESTextureGetTarget(texture), 0);
// Flush the CVOpenGLESTexture cache and release the texture
CVOpenGLESTextureCacheFlush(videoTextureCache, 0);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
CFRelease(texture);
}
結果CVOpenGLESTextureCacheCreateTextureFromImage失敗(錯誤:-6683),爲什麼呢?
薩姆您好,我被卡住用相同的錯誤消息。你有沒有發現什麼是錯的?謝謝! – 2012-06-01 15:56:33
同樣在這裏。如果你可以更新會很好。 – BlueVoodoo 2012-10-07 14:50:59