Применение CIFilter к видеофайлу и его сохранение
Есть ли какой-нибудь быстрый и легкий способ нанесенияCIFilter
к видео? Прежде чем это упомянуто, яиметь посмотрел наGPUImage - выглядит очень мощномагия код, но это действительно излишне для того, что я пытаюсь сделать.
По сути, я хотел бы
Возьмите видеофайл, скажем, хранится в/tmp/myVideoFile.mp4
ПрименитьCIFilter
к этому видеофайлуСохраните видеофайл в другом (или том же) месте, скажем/tmp/anotherVideoFile.mp4
Я смог применить CIFilter к видео, которое воспроизводится очень легко и быстро, используяAVPlayerItemVideoOutput
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
и затем сохраните новое видео в другом месте.