2012-04-06 316 views
9

我不得不从单独的视频帧提取YUV数据并将其保存在data[0],data[1],data[2];的帧大小为640*480;现在我创造了pixelBuffer如下:CVOpenGLESTextureCacheCreateTextureFromImage返回-6683(kCVReturnPixelBufferNotOpenGLCompatible)

void *pYUV[3] = {data[0], data[1], data[2]}; 
size_t planeWidth = {640, 320, 320}; 
size_t planeHeight = {480, 240, 240}; 
size_t planeBytesPerRow = {640, 320, 320}; 
CVReturn renturn = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault, 
            640, 
            480, 
            kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, 
            nil, 
            nil, 
            3, 
            pYUV, 
            planeWidth, 
            planeHeight, 
            planeBytesPerRow, 
            nil, 
            nil, nil, &_pixelBuffer); 
CVPixelBufferLockBaseAddress(_pixelBuffer, 0); 
CVPixelBufferRetain(_pixelBuffer); 
    // Periodic texture cache flush every frame 
CVOpenGLESTextureCacheFlush(_textureCache, 0); 

// The Buffer cannot be used with OpenGL as either its size, pixelformat or attributes are not supported by OpenGL 
glActiveTexture(GL_TEXTURE0); 
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, 
                  _textureCache, 
                  _pixelBuffer, 
                  NULL, 
                  GL_TEXTURE_2D, 
                  GL_LUMINANCE, 
                  im.width, 
                  im.height, 
                  GL_LUMINANCE, 
                  GL_UNSIGNED_BYTE, 
                  0, 
                  &_yTexture); 

if (!_yTexture || err) { 
    NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); 
    return; 
} 
glBindTexture(CVOpenGLESTextureGetTarget(_yTexture), CVOpenGLESTextureGetName(_yTexture)); 
CVPixelBufferUnlockBaseAddress(_pixelBuffer, 0); 

但犯错是-6638 ,文档只是声明“由于缓冲区大小,像素格式或属性不受支持,像素缓冲区与OpenGL不兼容”。这对我没有多大帮助。

我该如何修复它?

+0

你有没有想过这个?我有同样的问题 – Hammer 2012-07-06 23:57:00

+0

我得到了同样的错误。任何进展? – polyclick 2012-10-01 15:28:51

回答

1

您的源图像/视频帧是否具有2的幂的分辨率?如果没有,您必须在创建纹理之前调整它的大小。

1

苹果详细介绍了这个确切问题Technical Q&A 1781

原因的问题是,源像素缓冲区必须IOSSurface支持。指定一个空字典作为值kCVPixelBufferIOSurfacePropertiesKey