如何将“过滤器”应用于AVCaptureVideoPreviewLayer

问题描述 投票:30回答:3

我的应用程序当前正在使用AVFoundation从iPhone的后置摄像头获取原始摄像头数据,并将其实时显示在AVCaptureVideoPreviewLayer上。

我的目标是有条件地将简单的图像滤镜应用于预览层。图像未保存,因此不需要捕获输出。例如,我想切换一个设置,将预览层中输入的视频转换为黑白。

[我发现了一个问题here,似乎可以通过在缓冲区中捕获各个视频帧,应用所需的转换,然后将每个帧显示为UIImage来实现相似的功能。由于多种原因,这似乎对我的项目来说是过大了,我想避免这可能引起的任何性能问题。

这是实现我的目标的唯一方法吗?

正如我所提到的,我不是要捕获AVCaptureSession的任何视频,而只是预览它。

iphone avfoundation avcapturesession
3个回答
66
投票

可能最有效的处理方法是使用OpenGL ES过滤和显示这些视频帧。除了调整与另一个视图或图层叠加时的不透明度之外,您将无法直接对AVCaptureVideoPreviewLayer进行很多操作。

我有一个示例应用程序here,在其中我从相机抓取帧并应用OpenGL ES 2.0着色器实时处理视频以进行显示。在此应用程序中(详细说明here),我使用基于颜色的过滤来跟踪摄像机视图中的对象,但其他人已修改此代码以执行一些整洁的视频处理效果。在我的iPhone 4上,此应用程序中所有显示在屏幕上的基于GPU的过滤器均以60 FPS运行。

目前,唯一支持视频但没有OpenGL ES 2.0的GPU的iOS设备是iPhone 3G。如果还需要定位该设备,则可以获取视频捕获和OpenGL ES纹理生成的基本代码,然后使用Apple的GLImageProcessing示例应用程序中的过滤器代码。该应用程序是基于OpenGL ES 1.1构建的,所有iOS设备都提供对它的支持。

但是,我强烈建议为此目的使用OpenGL ES 2.0,因为与使用固定功能的OpenGL ES 1.1管道相比,使用着色器可以产生更多种效果。

((Edit:2/13/2012)作为上述更新,我现在创建了一个名为GPUImage的开源框架,该框架封装了这种自定义图像过滤功能。它还可以处理视频,并在过滤后将其显示在屏幕上,仅需六行代码即可完成所有这些设置。有关框架的更多信息,请阅读my more detailed announcement


3
投票

[我建议您查看ios开发库中的Rosy Writer示例。布拉德·拉尔森(Brad Larson)的GPUImage Library非常出色,但对于这个问题似乎有些过高了。

如果您只想向AVCaptureVideoPreviewLayer添加OpenGL着色器(也称为过滤器),则工作流将捕获会话的输出发送到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 Renderer中,将sourcePixelBuffer附加到纹理,您可以在OpenGL Shaders中对其进行过滤。着色器是基于每个像素运行的程序。 Rosy Writer示例还显示了使用OpenGL以外的其他过滤技术的示例。


0
投票

Apple的示例AVCamFilter 完成了所有操作>

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.