我在CPU上处理了一个(或可能是两个)CVPixelBufferRef对象,然后将结果放到最终的CVPixelBufferRef上。我想使用GLSL在GPU上进行此处理,因为CPU几乎无法跟上(这些是实时视频的帧)。我知道这是可能的"直接" (即编写我自己的开放式代码),但是从(绝对难以理解的)示例代码中我看到它是一项疯狂的工作。
似乎有两种选择:
1)GPUImage:这是一个很棒的库,但我有点不清楚我能不能轻易做到我想做的事。我尝试的第一件事是使用以下代码请求OpenGLES兼容的像素缓冲区:
@{ (NSString *)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA],
(NSString*)kCVPixelBufferOpenGLESCompatibilityKey : [NSNumber numberWithBool:YES]};
然后将数据从CVPixelBufferRef传输到GPUImageRawDataInput,如下所示:
// setup:
_foreground = [[GPUImageRawDataInput alloc] initWithBytes:nil size:CGSizeMake(0,0)pixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte];
// call for each frame:
[_foreground updateDataFromBytes:CVPixelBufferGetBaseAddress(foregroundPixelBuffer)
size:CGSizeMake(CVPixelBufferGetWidth(foregroundPixelBuffer), CVPixelBufferGetHeight(foregroundPixelBuffer))];
然而,在iPhone 5S上我的CPU使用率仅为7%到27%(没有处理或任何处理)。这表明CPU上正在进行一些复制,或者出现其他问题。我错过了什么吗?
2)OpenFrameworks:OF常用于此类事物,OF项目可以轻松设置为使用GLSL。但是,关于这个解决方案还有两个问题:1。我可以将openframeworks用作库,还是只需重新调整我的整个应用程序以使用OpenGL功能?我没有看到任何教程或文档显示我如何在不实际从头开始创建OF应用程序的情况下执行此操作。 2.是否可以使用CVPixelBufferRef作为纹理。
我的目标是iOS 7 +。