Я пишу приложение для длительной экспозиции изображения.сделалOutputSampleBuffer кадры кадры
Я использовал func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!)
получить CMSampleBuffer
для нанесения CIFilter
с помощью CILightenBlendMode
.
Проблема в том, что смешение занимает слишком много времени и приведет к падению кадров. Я попытался скопировать буфер:
var copiedBuffer:CMSampleBuffer?
CMSampleBufferCreateCopy(nil, sampleBuffer, &copiedBuffer)
blendImages(copiedBuffer!)
Но это не помогло, кадры по-прежнему падает.
Полный код:
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
if(CameraService.longExposureRunning){
var copiedBuffer:CMSampleBuffer?
CMSampleBufferCreateCopy(nil, sampleBuffer, &copiedBuffer)
blendImages(copiedBuffer!)
}
}
func captureOutput(captureOutput: AVCaptureOutput!, didDropSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
print("Dropped")
}
func blendImages(buffer:CMSampleBuffer){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)){
let pixelBuffer = CMSampleBufferGetImageBuffer(buffer)
let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!)
if let backgroundImage = self.lastImage{
let blendEffect = CIFilter(name: "CILightenBlendMode")
blendEffect?.setValue(backgroundImage, forKey: kCIInputBackgroundImageKey)
blendEffect?.setValue(cameraImage, forKey: kCIInputImageKey)
self.lastImage = blendEffect?.outputImage
print("Blending")
}else{
self.lastImage = cameraImage
}
let filteredImage = UIImage(CIImage: self.lastImage!)
dispatch_async(dispatch_get_main_queue())
{
imageView.image = filteredImage
}
}
}
Спасибо, я буду проверять это завтра :) – ferdyyy
Итак, я внедрил ваш метод, он по-прежнему отбрасывает много кадров в моем приложении. Но теперь он уменьшает количество кадров. Я получаю каждый 20-й кадр для обработки. Как вы создали CIContext? – ferdyyy
На моем iPad Pro у меня не было никаких капель. Возможно, стоит рассмотреть возможность использования целевого объекта на основе GPU и отображения с помощью GLKit 'GLKView'. В моих тестах я использовал контекст процессора: 'let context = Context()'. –