// Start the session DispatchQueue.global(qos: .userInitiated).async { self.session.startRunning() } }
// Delegate method called for each frame from the camera func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
// Convert the pixel buffer to a CIImage let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
// Apply a filter (Example: CIPhotoEffectChrome) guard let filter = CIFilter(name: "CIPhotoEffectChrome") else { return } filter.setValue(ciImage, forKey: kCIInputImageKey)
// Get the filtered image guard let outputImage = filter.outputImage else { return }
// Render the CIImage to a CGImage guard let cgImage = ciContext.createCGImage(outputImage, from: outputImage.extent) else { return }
// Convert the CGImage to a UIImage let uiImage = UIImage(cgImage: cgImage)
// Display the image on the preview view (UI updates must be on the main thread) DispatchQueue.main.async { //self.previewView.image = uiImage // Assuming previewView is a UIImageView //Instead of UIImageView, use a MetalKit view or a custom OpenGL view for better performance