如何在iOS中将Vignette CIFilter应用于实时摄像头?



avfoundation core-image (1)

在尝试将简单的晕影过滤器应用到iPhone6的原始相机进纸时,借助Metal和Core Image,我发现在 MTKView 处理和渲染的帧之间存在很多延迟

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

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

点号。 2和3都在名为 fillMTLTextureToStoreTheImageData 的方法内

  1. CIFilter 应用于从 MTLTexture 中的 MTKViewDelegate 获取的 CIImage
    func draw(in view: MTKView) {

        if let currentDrawable = view.currentDrawable {
            let commandBuffer = self.commandQueue.makeCommandBuffer()

            if let myTexture = self.sourceTexture{

                let inputImage = CIImage(mtlTexture: myTexture, options: nil)

                self.vignetteEffect.setValue(inputImage, forKey: kCIInputImageKey)

                self.coreImageContext.render(self.vignetteEffect.outputImage!, to: currentDrawable.texture, commandBuffer: commandBuffer, bounds: inputImage!.extent, colorSpace: self.colorSpace)

                commandBuffer?.present(currentDrawable)

                commandBuffer?.commit()
            }
        }
    }

苹果在本文档中提到的表现完全没有: https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

我错过了什么吗?


你的第2步太慢而无法支持实时渲染......看起来你错过了几个步骤。 为了您的目的,您通常会:

建立:

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

对于每个帧:

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

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

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