Как применить фильтр GPUImage в видеозаписи, используя AVCaptureSession в IOS? - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу применить пользовательский фильтр при записи видео, используя GPUImage и coreImage. GPUImage использовать только для эффекта carootize на видео.

Есть ли какой-либо фильтр в coreImage, который может создавать карикатурный эффект на изображении.

Мой код ниже, но он показывает ошибку при запуске Неожиданно обнаружен ноль при развертывании Необязательное значение: файл в PictureInput.swift line 20

Но без применения фильтра GPUImage он работает нормально, используя только фильтр coreImage.

 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    if output == audioOutput{

          audioWriterInput?.append(sampleBuffer)
      }
    else if output == videoOutput
    {
        connection.videoOrientation = AVCaptureVideoOrientation.portrait
        var pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
        var  cameraImage = CIImage(cvPixelBuffer: pixelBuffer!)



        var filter = CIFilter(name: "CISepiaTone")!
        filter.setValue(cameraImage, forKey: kCIInputImageKey)
        filter.setValue(0.7, forKey: kCIInputIntensityKey)


        let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer)!
        self.currentVideoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)
        self.currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer)



       var filterdImage:UIImage?

        var ciImage:CIImage?
        if let outputValue = filter.value(forKey: kCIOutputImageKey) as? CIImage {
            ciImage = outputValue
            filterdImage = UIImage(ciImage: outputValue)





        }


        //  GPUImage Filter Apply

        let toonFilter = SmoothToonFilter()
        toonFilter.blurRadiusInPixels = 4.5
        var cartoonImage:UIImage!
        if filterdImage != nil
        {
             cartoonImage = filterdImage!.filterWithOperation(toonFilter)
        }





        filteredBuffer = buffer(from: CIImage(image: cartoonImage)!)

        context.render(
            ciImage!, to: filteredBuffer!, bounds: ciImage!.extent, colorSpace: CGColorSpaceCreateDeviceRGB())
        if self.isWriting {
            if self.assetWriterPixelBufferInput?.assetWriterInput.isReadyForMoreMediaData == true {
                var newPixelBuffer: CVPixelBuffer? = nil

                CVPixelBufferPoolCreatePixelBuffer(nil, self.assetWriterPixelBufferInput!.pixelBufferPool!, &newPixelBuffer)

                let success = self.assetWriterPixelBufferInput?.append(filteredBuffer!, withPresentationTime: self.currentSampleTime!)


            }
        }


        DispatchQueue.main.async {
            self.imgView.image = cartoonImage

        }
    }


 }
...