gpt4 book ai didi

swift - 在 Swift 中如何直接从 CIImage 而不是 UIImage 制作 CVPixelBuffer?

转载 作者:可可西里 更新时间:2023-11-01 00:54:17 25 4
gpt4 key购买 nike

我正在通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com