PIP-эффект на кастомную камеру в ios - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь создать камеру с эффектом пипса в ios, используя swift 4, для этого я выбрал следующие элементы управления: Посмотреть FrontCameraView (ImageView) BackCameraView (ImageView) MaskedCameraView (ImageView)

FrontCameraView принимает размытое изображение, Frame Image - кадры в пипсах, а maskedCameraView - маскированные изображения.

Теперь, когда я снимаю изображение

Для применения живых эффектов к пользовательской камере: -

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        connection.videoOrientation = orientation
        let videoOutput = AVCaptureVideoDataOutput()
        videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main)

        let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
        let cameraImage = CIImage(cvImageBuffer: pixelBuffer!)
        let cgImage:CGImage = context.createCGImage(cameraImage, from: cameraImage.extent)!
        globalImage = UIImage.init(cgImage: cgImage)
        let croppedImage = HelperClass.shared().imageByScalingAndCropping(forSize:globalImage, CGSize.init(width:200, height: 200))
        DispatchQueue.main.async {
            self.backCameraView?.image = HelperClass.shared().blur(withCoreImage:croppedImage, andView:self.view)
            self.frontCameraView?.image = frameArray[self.tagValue]
            let maskedImage = self.maskImage(image:(croppedImage)!, mask:maskedArray[self.tagValue])
            let maskedcroppedImage = HelperClass.shared().imageByScalingAndCropping(forSize:maskedImage, CGSize.init(width:200, height: 200))
            self.maskedCameraView.image = maskedcroppedImage

        }
    }

// код для захвата изображения @IBAction func takePhoto (_ отправитель: UIButton) {

        if(captureSession.canAddOutput(videoOutput)){
            captureSession.addOutput(videoOutput)
        }
        let videoConnection = videoOutput.connection(with: AVMediaType.video)
        if(videoConnection != nil){
            photoOutput?.captureStillImageAsynchronously(from:videoConnection!, completionHandler: { (sampleBuffer, error) in

                if sampleBuffer != nil{

                    let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer!)
                    let dataProvider = CGDataProvider.init(data:imageData! as CFData)
                    let cgImageRef = CGImage.init(jpegDataProviderSource:dataProvider!, decode:nil, shouldInterpolate: true, intent: CGColorRenderingIntent.relativeColorimetric)
                    let image = UIImage.init(cgImage: cgImageRef!, scale:1.0, orientation:UIImageOrientation.right)


                    let sourceImage = HelperClass.shared().imageByScalingAndCropping(forSize:image,CGSize.init(width:200, height:200))

                    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
                    let framePreviewVC = storyBoard.instantiateViewController(withIdentifier: "FramePreviewController") as! FramePreviewController;                    framePreviewVC.frameImage = sourceImage!
                    self.navigationController?.pushViewController(framePreviewVC, animated: true)
                }
            })
        }
    }

Проблема: -Я могу реализовать PIP-эффект с помощью этого кода, но когда я пытаюсь захватить изображение с помощью videoOutput (AVCaptureVideoDataOutput), он не позволяет мне снимать изображения. И если я делаю то же самое, используя photoOutput (AVCaptureStillImageOutput), это не позволяет мне применять эффект PIP к живой камере. Пожалуйста, помогите мне решить эту проблему, я застрял в этой точке на неделю. Любое руководство в этом направлении будет высоко оценено. Заранее спасибо!

...