¿Cómo aplicar un CIFilter de Vignette a una alimentación de cámara en vivo en iOS?
ientras trato de aplicar un filtro de viñeta simple a la alimentación de la cámara sin procesar de un iPhone6, con la ayuda de Metal y Core Image, veo un gran retraso entre los marcos que se procesan y procesan en unaMTKView
El enfoque que he seguido es (MetalViewController.swift):
Obtenga una salida de cámara sin formato conAVCaptureVideoDataOutputSampleBufferDelegate
ConvertCMSampleBuffer
> CVPixelBuffer
> CGImage
Crear unMTLTexture
con esteCGImage
.Point no. 2 y 3 están dentro del método llamado:fillMTLTextureToStoreTheImageData
CIFilter
alCIImage
obtenido de laMTLTexture
en elMTKViewDelegate
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()
}
}
}
El rendimiento no es lo que Apple mencionó en este documento:https: //developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF10
¿Me estoy perdiendo de algo