我正在获取视频帧并使用函数 CVPixelBufferCreateWithPlanarBytes() 从视频帧中提取的两个平面数组创建一个 PixelBuffer,我已经检查了从 CVPixelBufferRef pixelBuffer =CMSampleBufferGetImageBuffer(sampleBuffer) 生成的像素缓冲区,并且创建的像素缓冲区是相同的,但是当我创建使用 CVOpenGLESTextureCacheCreateTextureFromImage() 的纹理返回错误 -6683,请任何人帮我找出这里出了什么问题,提前谢谢
问问题
1442 次
2 回答
2
我没有通过 CVPixelBufferCreateWithPlanarBytes() 创建 cvpixelbufferref,而是尝试通过 CVPixelBufferCreate() 创建它,然后像这样手动复制副本,
baseaddrY=CVPixelBufferGetBaseAddressOfPlane(pixelBuffer,0);
baseaddrUV=CVPixelBufferGetBaseAddressOfPlane(pixelBuffer,1);
memcpy(baseaddrY,dataY,sizeofY);
memcpy(baseaddrUV,dataUV,sizeofUV);
这将创建 cvpixelbufferref。这是安东对问题的回答,CVOpenGLESTextureCacheCreateTextureFromImage 返回错误 6683
于 2013-04-30T06:43:14.747 回答
2
根据文档,此错误的原因是:
“由于不支持的缓冲区大小、像素格式或属性,像素缓冲区与 OpenGL 不兼容。”
所以这意味着两件事中的一件:
1:当您设置纹理缓冲区时,您使用的是 OpenGLES 不支持的像素格式,调用时:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, data);
2:如果我没记错的话,是因为视频帧图像格式与 OpenGLES 实现不兼容。如果它来自设备相机,我相信它的 YCbCr 并且必须转换为 RGB / RGBA 的图像。
请记住,对于各种图像格式,每个像素也有不同的位数。所以检查iOS支持哪些我认为大多数来自Khronos规范,我主要使用RGBA_8888来保证质量)。尽管上面的示例适用于我在不使用 PVRTC 时倾向于使用的任何 PNG
这显示了如何获取帧并使用 CGImage 将其转换为 iOS 上的 OpenGLES 友好格式,您可以将其用作纹理。
于 2013-04-24T07:54:27.133 回答