Shr*_*aya 3 ios swift metal metalkit metal-performance-shaders
我要求在实时视频上应用过滤器,我正在尝试在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))
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
这是通过金属渲染图像的屏幕截图
以下是将MTLTexture转换为CVPixelBuffer的同一图像的屏幕截图.
将MTLtexture转换为CVPixelBuffer需要写入AVAssetWriter,然后将其保存到库中.
不要那样计算bytesPerRow自己.它被传递给Metal以让Metal知道如何排列行.您希望Metal按照CVPixelBuffer预期的方式排列它们.因此,您应该使用CVPixelBufferGetBytesPerRow()确定值.
| 归档时间: |
|
| 查看次数: |
2756 次 |
| 最近记录: |