Ios 通过OpenGL处理AVCapture输出样本缓冲区的有效方法
简单来说,我想做的是: -使用Ios 通过OpenGL处理AVCapture输出样本缓冲区的有效方法,ios,iphone,camera,opengl-es-2.0,avcapture,Ios,Iphone,Camera,Opengl Es 2.0,Avcapture,简单来说,我想做的是: -使用AVCaptureVideoDataOutputSampleBufferDelegate -然后通过openGL处理captureOutput委托方法内部的帧 现在根据苹果的例子,实现这一点的方法是使用以下步骤: 创建CVOpenGLESTextureCache 使用CVOpenGLESTextureCacheCreateTextureFromImage使用纹理缓存和提供的样本缓冲区创建纹理 通过传递到OpenGL对该纹理进行操作 纹理也会被释放,并且纹理缓存会在
AVCaptureVideoDataOutputSampleBufferDelegate
-然后通过openGL处理captureOutput委托方法内部的帧
现在根据苹果的例子,实现这一点的方法是使用以下步骤:
- 创建
CVOpenGLESTextureCache
- 使用
使用纹理缓存和提供的样本缓冲区创建纹理CVOpenGLESTextureCacheCreateTextureFromImage
- 通过传递到OpenGL对该纹理进行操作
- 纹理也会被释放,并且纹理缓存会在每帧刷新一次
谢谢 我使用了您描述的这种方法,效果很好。在mydidOutputSampleBuffer中,如下所示:
CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer);
int bufferHeight = (int)CVPixelBufferGetHeight(cameraFrame);
int bufferWidth = (int)CVPixelBufferGetWidth(cameraFrame);
//clear cache
if (_textureCached) {
CFRelease(_textureCached);
_textureCached = NULL;
}
CVOpenGLESTextureCacheFlush(_videoTextureCache, 0);
CVReturn err;
glActiveTexture(GL_TEXTURE0);
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _videoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA , bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &_textureCached);
glBindTexture(CVOpenGLESTextureGetTarget(_textureCached), CVOpenGLESTextureGetName(_textureCached));
此外,我不在didOutputSampleBuffer内的glkView中调用setNeedsDisplay。也许这会有帮助。我使用了您描述的这种方法,效果很好。在mydidOutputSampleBuffer中,如下所示:
CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer);
int bufferHeight = (int)CVPixelBufferGetHeight(cameraFrame);
int bufferWidth = (int)CVPixelBufferGetWidth(cameraFrame);
//clear cache
if (_textureCached) {
CFRelease(_textureCached);
_textureCached = NULL;
}
CVOpenGLESTextureCacheFlush(_videoTextureCache, 0);
CVReturn err;
glActiveTexture(GL_TEXTURE0);
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _videoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA , bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &_textureCached);
glBindTexture(CVOpenGLESTextureGetTarget(_textureCached), CVOpenGLESTextureGetName(_textureCached));
此外,我不在didOutputSampleBuffer内的glkView中调用setNeedsDisplay。也许这会有帮助