【发布时间】:2017-12-04 04:32:59
【问题描述】:
我需要在实时视频上应用过滤器,我正在尝试在 Metal 中执行此操作。
但是在将过滤器编码为目标过滤器后,我遇到了将 MTLTexture 转换为 CVPixelBuffer 的问题。参考(https://github.com/oklyc/MetalCameraSample-master-2)
这是我的代码。
if let pixelBuffer = pixelBuffer {
CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0))
let region = MTLRegionMake2D(0, 0, Int(currentDrawable.layer.drawableSize.width), Int(currentDrawable.layer.drawableSize.height))
let bytesPerPixel = 4;
let bytesPerRow = CGFloat(bytesPerPixel) * currentDrawable.layer.drawableSize.width
let tempBuffer = CVPixelBufferGetBaseAddress(pixelBuffer)
destinationTexture.getBytes(tempBuffer!, bytesPerRow: Int(bytesPerRow), from: region1, mipmapLevel: 0)
let image = self.imageFromCVPixelBuffer(buffer: pixelBuffer)
CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0))
}
方法 imageFromCVPixelBuffer 如下所示。
func imageFromCVPixelBuffer(buffer: CVPixelBuffer) -> UIImage {
let ciimage = CIImage(cvPixelBuffer: buffer)
let context = CIContext(options: nil)
let cgimgage = context.createCGImage(ciimage, from: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(buffer), height: CVPixelBufferGetHeight(buffer)))
let uiimage = UIImage(cgImage: cgimgage!)
return uiimage
}
这是通过金属渲染图像的屏幕截图
这是将 MTLTexture 转换为 CVPixelBuffer 的同一图像的屏幕截图。
需要将 MTLtexture 转换为 CVPixelBuffer 以写入 AVAssetWriter 然后将其保存到库中。
【问题讨论】:
-
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
-
我也在尝试将 mtltexture 与 avassetwriter 一起使用。你能分享你的最终代码吗?
-
转换为 UIImage 我相信速度很慢,如果您正在制作视频,性能会很差。显然,这对于屏幕截图来说完全没问题。
标签: ios swift metal metalkit metal-performance-shaders