视频过滤器很慢
Video filters are slow
我正在为预先录制的视频添加滤镜,但是当应用滤镜时,视频会滞后并且变慢。
非常感谢您的帮助。
func applyFilters(){
let displayLink = CADisplayLink(target: self, selector: #selector(self.editVideo(_:)))
displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
let url = NSURL(fileURLWithPath: outputPath)
let asset = AVAsset(URL: url)
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)
output = AVPlayerItemVideoOutput(pixelBufferAttributes: nil)
player?.currentItem?.addOutput(output)
player.play()
}
func editVideo(link: CADisplayLink){
let filter = CIFilter(name: "CISepiaTone")!
let itemTime = output.itemTimeForHostTime(CACurrentMediaTime())
if output.hasNewPixelBufferForItemTime(itemTime){
if let pixelBuffer = output.copyPixelBufferForItemTime(itemTime, itemTimeForDisplay: nil){
let image = CIImage(CVPixelBuffer: pixelBuffer)
let context = CIContext(options: nil)
filter.setValue(image, forKeyPath: kCIInputImageKey)
if let output = filter.outputImage {
let cgimg = context.createCGImage(output, fromRect: output.extent)
let processedImage = UIImage(CGImage: cgimg)
filtersImageView.image = processedImage
}
}
}
}
您正在为每个帧创建一个新的 CIContext
,这非常耗费性能。创建一个类似于 let context = CIContext()
的 属性,然后从 editVideo
中删除 let context = CIContext(options: nil)
。您还应该知道,默认情况下 CIContext
将使用 CPU 进行图像处理,您可以指定 OpenGL 或 Metal 上下文以获得更好的性能,尽管在这种情况下这不是必需的。
有关您正在做的事情的完整示例,您应该查看 FlexMonkey's VideoEffects repository
我正在为预先录制的视频添加滤镜,但是当应用滤镜时,视频会滞后并且变慢。
非常感谢您的帮助。
func applyFilters(){
let displayLink = CADisplayLink(target: self, selector: #selector(self.editVideo(_:)))
displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
let url = NSURL(fileURLWithPath: outputPath)
let asset = AVAsset(URL: url)
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)
output = AVPlayerItemVideoOutput(pixelBufferAttributes: nil)
player?.currentItem?.addOutput(output)
player.play()
}
func editVideo(link: CADisplayLink){
let filter = CIFilter(name: "CISepiaTone")!
let itemTime = output.itemTimeForHostTime(CACurrentMediaTime())
if output.hasNewPixelBufferForItemTime(itemTime){
if let pixelBuffer = output.copyPixelBufferForItemTime(itemTime, itemTimeForDisplay: nil){
let image = CIImage(CVPixelBuffer: pixelBuffer)
let context = CIContext(options: nil)
filter.setValue(image, forKeyPath: kCIInputImageKey)
if let output = filter.outputImage {
let cgimg = context.createCGImage(output, fromRect: output.extent)
let processedImage = UIImage(CGImage: cgimg)
filtersImageView.image = processedImage
}
}
}
}
您正在为每个帧创建一个新的 CIContext
,这非常耗费性能。创建一个类似于 let context = CIContext()
的 属性,然后从 editVideo
中删除 let context = CIContext(options: nil)
。您还应该知道,默认情况下 CIContext
将使用 CPU 进行图像处理,您可以指定 OpenGL 或 Metal 上下文以获得更好的性能,尽管在这种情况下这不是必需的。
有关您正在做的事情的完整示例,您应该查看 FlexMonkey's VideoEffects repository