如何将Vignette CIFilter应用于iOS中的实时相机源?

时间:2018-12-22 19:39:40

标签: ios avfoundation core-image cifilter metalkit

当尝试在Metal和Core Image的帮助下将简单的小插图滤镜应用于iPhone6的原始摄像头馈送时,我发现MTKView中要处理和渲染的帧之间存在很多滞后/ p>

我遵循的方法是(MetalViewController.swift):

  1. 使用AVCaptureVideoDataOutputSampleBufferDelegate
  2. 获取原始相机输出
  3. 转换CMSampleBuffer> CVPixelBuffer> CGImage
  4. 使用此MTLTexture创建一个CGImage

点号2和3在名为fillMTLTextureToStoreTheImageData

的方法中
  1. CIFilter应用于从CIImage的{​​{1}}获取的MTLTexture
MTKViewDelegate

性能根本不是苹果在本文档中提到的:https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

我想念什么吗?

1 个答案:

答案 0 :(得分:3)

您的步骤2太慢了,无法支持实时渲染...,看来您缺少了几个步骤。为了您的目的,通常可以:

设置:

  1. 创建CVPixelBuffer的池-使用CVPixelBufferPoolCreate
  2. 使用CVMetalTextureCacheCreate创建金属纹理池

对于每帧:

  1. 转换CMSampleBuffer> CVPixelBuffer> CIImage
  2. CIImage通过过滤器管道
  3. 将输出图像从步骤1中创建的池中渲染到CVPixelBuffer
  4. 使用CVMetalTextureCacheCreateTextureFromImage通过过滤的CVPixelBuffer创建金属质感

如果设置正确,所有这些步骤将确保您的图像数据保留在GPU上,而不是从GPU传输到CPU再返回GPU进行显示。

好消息是,所有这些都在Apple https://developer.apple.com/library/archive/samplecode/AVCamPhotoFilter/Introduction/Intro.html#//apple_ref/doc/uid/TP40017556的AVCamPhotoFilter示例代码中进行了演示。特别是请参见RosyCIRenderer类及其超类FilterRenderer