Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将MTLTexture转换为CVpixelBuffer以写入AVAssetWriter?_Ios_Swift_Metal_Metalkit_Metal Performance Shaders - Fatal编程技术网

Ios 如何将MTLTexture转换为CVpixelBuffer以写入AVAssetWriter?

Ios 如何将MTLTexture转换为CVpixelBuffer以写入AVAssetWriter?,ios,swift,metal,metalkit,metal-performance-shaders,Ios,Swift,Metal,Metalkit,Metal Performance Shaders,我有一个在现场视频上应用过滤器的要求,我正试图用金属做它 但在将过滤器编码为目标过滤器后,我遇到了将MTLTexture转换为CVPixelBuffer的问题。参考号() 这是我的密码 if let pixelBuffer = pixelBuffer { CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags.init(rawValue: 0))

我有一个在现场视频上应用过滤器的要求,我正试图用金属做它

但在将过滤器编码为目标过滤器后,我遇到了将MTLTexture转换为CVPixelBuffer的问题。参考号()

这是我的密码

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
}
这是通过metal渲染图像的屏幕截图

下面是将MTLTexture转换为CVPixelBuffer的同一图像的屏幕截图


将MTLtexture转换为CVPixelBuffer需要写入AVAssetWriter,然后将其保存到库中。

不要自己这样计算
bytesPerRow
。它被传递给金属,让金属知道如何排列行。您希望金属按照
CVPixelBuffer
所期望的方式排列它们。因此,您应该使用
CVPixelBufferGetBytesPerRow()
来确定值。

请阅读-总结是,这不是解决志愿者问题的理想方法,可能会对获得答案产生反作用。请不要将此添加到您的问题中。我还尝试将mtltexture与avassetwriter一起使用。你能分享你的最终代码吗?我相信转换成UIImage相当慢,如果你正在制作视频,会给你带来很差的性能。很明显,对于屏幕截图来说这是完全正确的。我相信CVPixelBuffer中的行是32像素对齐的。如果您开始假设这些缓冲区在每行末尾不包含任何填充字节,则会出现问题。请稍候,但您将像素数据从mtltexture复制到cvpixelbuffer的位置是?