Aplicando um CIFilter a um arquivo de vídeo e salvando-o

Existe alguma maneira rápida e leve possível de aplicar umCIFilter para um vídeo? Antes de ser mencionado, euter olhou paraGPUImage - parece muito poderosoMagia código, mas é realmente um exagero para o que estou tentando fazer.

Essencialmente, eu gostaria de

Pegue um arquivo de vídeo, digamos, armazenado em/tmp/myVideoFile.mp4Aplicar umCIFilter para este arquivo de vídeoSalve o arquivo de vídeo em um local diferente (ou o mesmo), digamos/tmp/anotherVideoFile.mp4

Consegui aplicar um filtro CIF a um vídeo que é reproduzido com extrema facilidade e rapidez usandoAVPlayerItemVideoOutput

let player = AVPlayer(playerItem: AVPlayerItem(asset: video))
let output = AVPlayerItemVideoOutput(pixelBufferAttributes: nil)
player.currentItem?.addOutput(self.output)
player.play()

let displayLink = CADisplayLink(target: self, selector: #selector(self.displayLinkDidRefresh(_:)))
displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)

func displayLinkDidRefresh(link: CADisplayLink){
    let itemTime = output.itemTimeForHostTime(CACurrentMediaTime())
    if output.hasNewPixelBufferForItemTime(itemTime){
        if let pixelBuffer = output.copyPixelBufferForItemTime(itemTime, itemTimeForDisplay: nil){
            let image = CIImage(CVPixelBuffer: pixelBuffer)
            // apply filters to image
            // display image
        }
    }
}

Isso funciona muito bem, mas eu tenho tidomuito o mínimo de problemas para descobrir como aplicar um filtro a um arquivo de vídeo já salvo. Existe a opção de basicamente fazer o que fiz acima, usando umAVPlayer, reproduzindo o vídeo e obtendo o buffer de pixels de todos os quadros em que é reproduzido, mas isso não funcionará no processamento de vídeo em segundo plano. Eu não acho que os usuários gostariam de ter que esperar enquanto o vídeo for aplicado ao filtro.

No código simplificado, estou procurando algo assim:

var newVideo = AVMutableAsset() // We'll just pretend like this is a thing

var originalVideo = AVAsset(url: NSURL(urlString: "/example/location.mp4"))
originalVideo.getAllFrames(){(pixelBuffer: CVPixelBuffer) -> Void in
    let image = CIImage(CVPixelBuffer: pixelBuffer)
        .imageByApplyingFilter("Filter", withInputParameters: [:])

    newVideo.addFrame(image)
}

newVideo.exportTo(url: NSURL(urlString: "/this/isAnother/example.mp4"))

Existe alguma maneira rápida (novamente, sem envolver GPUImage e, idealmente, trabalhando no iOS 7), aplicar um filtro a um arquivo de vídeo e salvá-lo? Por exemplo, isso levaria um vídeo salvo, carregue-o em umAVAsset, Aplicar umCIFiltere salve o novo vídeo em um local diferente.

questionAnswers(1)

yourAnswerToTheQuestion