Ios 当图像数据样本用于渲染OpenGL纹理时,捕获静态图像失败
我必须使用Ios 当图像数据样本用于渲染OpenGL纹理时,捕获静态图像失败,ios,opengl-es,opengl-es-2.0,avfoundation,Ios,Opengl Es,Opengl Es 2.0,Avfoundation,我必须使用AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:捕获一组图像,并使用OpenGL作为纹理在屏幕上渲染它们,为此,我从捕获输出的CMSampleBufferRef传递CVPixelBufferRef。第一次捕获成功,但对于后续捕获,我得到了一个错误 Error Domain=AVFoundationErrorDomain code=-11801“无法完成操作” 代码如下 dispatch_as
AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:
捕获一组图像,并使用OpenGL作为纹理在屏幕上渲染它们,为此,我从捕获输出的CMSampleBufferRef传递CVPixelBufferRef。第一次捕获成功,但对于后续捕获,我得到了一个错误
Error Domain=AVFoundationErrorDomain code=-11801“无法完成操作”
代码如下
dispatch_async(dispatch_get_main_queue(), ^{
if (self.videoConnection) {
[self.imageOutput captureStillImageAsynchronouslyFromConnection:self.videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
if (!imageDataSampleBuffer) {
return ;
}
if (imageDataSampleBuffer) {
CVPixelBufferRef pxBuff = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
if ([self.captureDelegate respondsToSelector:@selector(didCaptureBufferRef:)]) {
[_captureDelegate didCaptureBufferRef:pxBuff];
}
}
}];
}});
及
最终调用此函数(我跳过了中间调用,因为pxBuff没有在任何地方使用,只是传递了它)
我做错了什么?当我移除
[_captureDelegate didCaptureBufferRef:pxBuff];
事情进展顺利,成功发生
[\u captureDelegate didCaptureBufferRef:pxBuff]内部发生了什么代码>?@SAKrisT,很抱歉耽搁了(必须旅行一个小时才能回家)。我已经添加了def。对于使用CVPixelBufferRef的函数。谢谢
- (void)textureFromBufferRef:(CVPixelBufferRef)pixelBuffer
{
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
glActiveTexture(GL_TEXTURE0);
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _textureCacheRef, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RED_EXT, (GLsizei)width, (GLsizei)height, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &_captureImageTextureRef);
glBindTexture(CVOpenGLESTextureGetTarget(_captureImageTextureRef), CVOpenGLESTextureGetName(_captureImageTextureRef));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
[_captureDelegate didCaptureBufferRef:pxBuff];