如何将"过滤器"应用于AVCaptureVideoPreviewLayer

esc*_*ter 30 iphone avfoundation avcapturesession

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

我的目标是有条不紊地将简单的图像过滤器应用于预览图层.图像未保存,因此我不需要捕获输出.例如,我想切换一个设置,将预览图层中的视频转换为Black&White.

我在这里发现了一个问题似乎通过在缓冲区中捕获单个视频帧,应用所需的转换,然后将每个帧显示为UIImage来实现类似的功能.由于多种原因,这似乎对我的项目来说太过分了,我想避免这可能导致的任何性能问题.

这是实现目标的唯一途径吗?

正如我所提到的,我不打算捕获任何AVCaptureSession的视频,只是预览它.

Bra*_*son 66

可能最有效的处理方法是使用OpenGL ES过滤和显示这些视频帧.除了在与另一个视图或图层重叠时调整其不透明度之外,您将无法直接使用AVCaptureVideoPreviewLayer.

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

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

但是,我强烈建议您考虑使用OpenGL ES 2.0,因为使用着色器可以实现比使用固定功能OpenGL ES 1.1管道更多种类的效果.

(编辑:2/13/2012)作为上述的更新,我现在创建了一个名为GPUImage的开源框架,它封装了这种自定义图像过滤.它还可以处理捕获视频并在过滤后将其显示在屏幕上,只需要六行代码即可设置所有这些内容.有关框架的更多信息,您可以阅读我更详细的公告.

  • @UFO - iOS 7上的双通过滤器和静止图像存在已知错误,是的.他们使用实时相机输入和电影,但由于某些原因在该操作系统上使用静止图像产生黑色图像.我在调查它. (2认同)