Ein CIFilter auf eine Videodatei anwenden und speichern

ibt es eine schnelle und möglichst leichte Möglichkeit, ein @ anzuwendeCIFilter zu einem Video? Bevor es erwähnt wird, ichhabe betrachtete GPUImage - es sieht aus wie sehr mächtigMagi Code, aber es ist wirklich übertrieben für das, was ich versuche zu tun.

Im Wesentlichen möchte ich

Nehmen Sie eine Videodatei auf, z. B. gespeichert unter/tmp/myVideoFile.mp4Anwenden einesCIFilter zu dieser VideodateiSpeichern Sie die Videodatei an einem anderen (oder demselben) Ort, sagen Sie/tmp/anotherVideoFile.mp4

Ich konnte einen CIFilter auf ein Video anwenden, das mit @ extrem einfach und schnell wiedergegeben werden kanAVPlayerItemVideoOutput

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
        }
    }
}

Das funktioniert super, aber ich habevie nur die kleinste Mühe herauszufinden, wie ein Filter auf eine bereits gespeicherte Videodatei angewendet wird. Es gibt die Möglichkeit, im Grunde nur das zu tun, was ich oben getan habe, mit einemAVPlayer, Wiedergabe des Videos und Abrufen des Pixelpuffers von jedem Bild, während es wiedergegeben wird. Dies funktioniert jedoch nicht für die Videoverarbeitung im Hintergrund. Ich glaube nicht, dass Nutzer es begrüßen würden, warten zu müssen, solange ihr Video auf den Filter angewendet wird.

In viel zu stark vereinfachtem Code suche ich nach so etwas:

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"))

Gibt es eine Möglichkeit, einen Filter schnell (auch ohne GPUImage und idealerweise mit iOS 7) auf eine Videodatei anzuwenden und diese dann zu speichern? Zum Beispiel würde dies ein gespeichertes Video nehmen, es in ein @ ladAVAsset, bewerbe einCIFilter und speichern Sie das neue Video an einem anderen Ort.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage