我正在通过iPhone摄像机录制经过过滤的视频,并且在录制时将CIImage实时转换为UIImage时,CPU使用率大大增加。我制作CVPixelBuffer的缓冲区函数使用UIImage,到目前为止,我需要进行此转换。我想做一个缓冲函数,如果可能的话可以使用CIImage,这样我就可以跳过从UIImage到CIImage的转换。我认为这将在录制视频时极大地提高性能,因为在CPU和GPU之间不会有任何麻烦。
这就是我现在所拥有的。在我的captureOutput函数中,我从CIImage创建一个UIImage,它是过滤后的图像。我使用UIImage从缓冲区函数创建一个CVPixelBuffer,并将其附加到assetWriter的pixelBufferInput上:
let imageUI = UIImage(ciImage: ciImage)
let filteredBuffer:CVPixelBuffer? = buffer(from: imageUI)
let success = self.assetWriterPixelBufferInput?.append(filteredBuffer!, withPresentationTime: self.currentSampleTime!)
我的缓冲区函数使用UIImage:
func buffer(from image: UIImage) -> CVPixelBuffer? {
let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary
var pixelBuffer : CVPixelBuffer?
let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(image.size.width), Int(image.size.height), kCVPixelFormatType_32ARGB, attrs, &pixelBuffer)
guard (status == kCVReturnSuccess) else {
return nil
}
CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer!)
let videoRecContext = CGContext(data: pixelData,
width: Int(image.size.width),
height: Int(image.size.height),
bitsPerComponent: 8,
bytesPerRow: videoRecBytesPerRow,
space: (MTLCaptureView?.colorSpace)!, // It's getting the current colorspace from a MTKView
bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)
videoRecContext?.translateBy(x: 0, y: image.size.height)
videoRecContext?.scaleBy(x: 1.0, y: -1.0)
UIGraphicsPushContext(videoRecContext!)
image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
UIGraphicsPopContext()
CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
return pixelBuffer
}
最佳答案
创建一个CIContext
,并使用它来使用 CIImage
将CVPixelBuffer
直接呈现为您的CIContext.render(_: CIImage, to buffer: CVPixelBuffer)
。
关于swift - 如何在Swift中直接从CIImage而不是UIImage制作CVPixelBuffer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54354138/