IOS में लाइव कैमरा फीड के लिए Vignette Cifilter कैसे लागू करें?



avfoundation core-image (1)

आपका चरण 2 वास्तविक समय प्रतिपादन का समर्थन करने के लिए बहुत धीमा है ... और ऐसा लगता है कि आप कुछ चरणों को याद कर रहे हैं। अपने उद्देश्य के लिए, आप आमतौर पर:

सेट अप:

  1. CVPixelBuffer का उपयोग करके - CVPixelBuffer का एक पूल CVPixelBufferPoolCreate
  2. CVMetalTextureCacheCreate का उपयोग करके धातु बनावट का एक पूल CVMetalTextureCacheCreate

प्रत्येक फ्रेम के लिए:

  1. CMSampleBuffer > CVPixelBuffer > CIImage कनवर्ट करें
  2. अपने फ़िल्टर पाइपलाइन के माध्यम से उस CIImage पास करें
  3. चरण 1 में निर्मित पूल से एक CVPixelBuffer में आउटपुट छवि प्रस्तुत करें
  4. अपने फ़िल्टर किए गए CVPixelBuffer के साथ धातु की बनावट बनाने के लिए CVMetalTextureCacheCreateTextureFromImage का उपयोग करें

यदि सही तरीके से सेटअप किया जाता है, तो ये सभी कदम यह सुनिश्चित करेंगे कि आपका छवि डेटा GPU पर रहेगा, क्योंकि GPU से CPU तक और डिस्प्ले के लिए GPU से वापस यात्रा करने का विरोध किया गया है।

अच्छी खबर यह है कि यह सब ऐप्पल https://developer.apple.com/library/archive/samplecode/AVCamPhotoFilter/Introduction/Intro.html#//apple_ref/doc/uid/TP40017556 से AVCAMPhotoFilter नमूना कोड में प्रदर्शित किया गया है। विशेष रूप से RosyCIRenderer वर्ग और इसके FilterRenderer

एक iPhone6 ​​के कच्चे कैमरे के फ़ीड के लिए एक सरल विगनेट फ़िल्टर लागू करने की कोशिश करते हुए, धातु और कोर छवि की मदद से, मुझे एक MTKView में संसाधित और प्रस्तुत किए जा रहे फ़्रेम के बीच बहुत अधिक अंतराल MTKView

मैंने जो दृष्टिकोण अपनाया है वह है (MetalViewController.swift):

  1. AVCaptureVideoDataOutputSampleBufferDelegate का उपयोग करके कच्चे कैमरा आउटपुट प्राप्त करें
  2. CMSampleBuffer > CVPixelBuffer > CGImage कनवर्ट करें
  3. इस CGImage साथ एक MTLTexture बनाएं।

प्वाइंट नं। 2 और 3 नामक विधि के अंदर हैं: fillMTLTextureToStoreTheImageData

  1. CIFilter में CIImage प्राप्त CIFilter एक CIFilter लागू करें
    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()
            }
        }
    }

प्रदर्शन बिल्कुल भी नहीं है जो इस डॉक में उल्लिखित है Apple: https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

क्या मैं कुछ भूल रहा हूँ?