ビデオにCIFilter
を適用する方法は、軽量で可能な限り速い方法はありますか?それが言及される前に、私はを見てGPUImageを見た - それは非常に強力なの魔法コードのように見えるが、それは私がやろうとしているもののために本当に残酷だ。ビデオファイルにCIFilterを適用して保存する
基本的に、私は/tmp/myVideoFile.mp4
CIFilter
異なる(または同じ)にビデオファイルを保存- したいと言うだろうlocation、say
/tmp/anotherVideoFile.mp4
を使用して非常に簡単にすばやく再生される動画にCIFilterを適用することができました
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
}
}
}
これは素晴らしい作品が、私は多くの問題ちょうど最も小さいビットが既に保存された動画ファイルにフィルタを適用する方法を見つけ出すを持ってきました。基本的には、上記のように、ビデオを再生し、再生されるごとにピクセルバッファをすべてのフレームから取得するという方法で、AVPlayer
を使用するというオプションがありますが、これはバックグラウンドでのビデオ処理では機能しません。私は、ユーザーのビデオがフィルタが適用されている限り、待つ必要はないと思っています。 、私はこのような何かのために道オーバー簡素化コードで
探しています:
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"))
どのような方法速くあります(もう一度、GPUImageを含む、理想的にiOSの7で動作していない)を適用する方法ビデオファイルにフィルターをかけて保存しますか?たとえば、これは保存されたビデオを取り込み、AVAsset
にロードし、CIFilter
を適用して新しいビデオを別の場所に保存します。
私はこれを実行することができました。コードは[GitHubで利用可能です](https://github.com/jojodmo/VideoFilterExporter) – Jojodmo