Я хочу применить пользовательский фильтр при записи видео, используя 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
}
}
}