我建议查看 ios 开发库中的Rosy Writer示例。Brad Larson 的GPUImage 库非常棒,但对于这个问题似乎有点矫枉过正。
如果您只是对将 OpenGL 着色器(又名过滤器)添加到AVCaptureVideoPreviewLayer
工作流感兴趣,那么您可以将捕获会话的输出发送到 OpenGL 视图进行渲染。
AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
videoOut.videoSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(_renderer.inputPixelFormat) };
[videoOut setSampleBufferDelegate:self queue:_videoDataOutputQueue];
然后在captureOutput:
委托中将样本缓冲区发送到 OpenGL Renderer
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVPixelBufferRef sourcePixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
_renderer copyRenderedPixelBuffer:sourcePixelBuffer];
}
在 OpenGL 渲染器中附加sourcePixelBuffer
到纹理,您可以在 OpenGL 着色器中对其进行过滤。着色器是在每像素基础上运行的程序。Rosy Writer 示例还展示了使用除 OpenGL 之外的不同过滤技术的示例。