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.mp4
Aplicar 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 umCIFilter
e salve o novo vídeo em um local diferente.