iphone - 如何将 "filters"应用于 AVCaptureVideoPreviewLayer

标签 iphone avfoundation avcapturesession

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

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

我发现了一个问题here这似乎通过捕获缓冲区中的各个视频帧,应用所需的转换,然后将每个帧显示为 UIImage 来完成类似的事情。由于多种原因,这对于我的项目来说似乎有些过分,我希望避免这可能导致的任何性能问题。

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

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

最佳答案

处理此问题的最高效方法可能是使用 OpenGL ES 来过滤和显示这些视频帧。除了在与其他 View 或图层重叠时调整其不透明度之外,您将无法直接使用 AVCaptureVideoPreviewLayer 执行太多操作。

我有一个示例应用程序here我从相机中抓取帧并应用 OpenGL ES 2.0 着色器来实时处理视频以进行显示。在此应用程序中(详细解释here),我使用基于颜色的过滤来跟踪相机 View 中的对象,但其他人修改了此代码以实现一些简洁的视频处理效果。此应用程序中显示在屏幕上的所有基于 GPU 的滤镜在我的 iPhone 4 上都以 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 管道相比,使用着色器可以实现更多种类的效果。

(编辑:2012 年 2 月 13 日)作为上述内容的更新,我现在创建了一个名为 GPUImage 的开源框架。封装了这种自定义图像过滤。它还负责捕获视频并在过滤后将其显示到屏幕上,只需六行代码即可完成所有这些设置。有关该框架的更多信息,您可以阅读my more detailed announcement .

关于iphone - 如何将 "filters"应用于 AVCaptureVideoPreviewLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156872/

相关文章:

ios - iOS 12 上的过滤深度数据似乎已旋转

objective-c - AVCaptureVideoPreviewLayer 在简历上不显示任何内容

iphone - 在 viewDidLoad 中设置 UINavigationbar 属性不会执行任何操作

ios - AVFoundation:isExposureModeSupported 为 AVCaptureExposureModeAutoExpose 返回 FALSE

iphone - Objective-C初学者(发布)问题

ios - MPMoviePlayer 卡在 "loading..."

swift - 无法使用 AVFoundation 将 JPEG 图像写入 HDD

swift - 单个 Vision/CoreML 推理的多个 CALayer 更新

ios - 在 xcode 中反转的阿拉伯字符串

iphone - 使用 NSString drawInRect 绘制旋转文本