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

标签 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))

            }

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 渲染图像的屏幕截图

enter image description here

这是将 MTLTexture 转换为 CVPixelBuffer 的同一图像的屏幕截图。

enter image description here

需要将MTLtexture转换成CVPixelBuffer,写入AVAssetWriter,然后保存到Library。

最佳答案

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

关于ios - 如何将 MTLTexture 转换为 CVpixelBuffer 以写入 AVAssetWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44842661/

相关文章:

facebook FBSDKGraphRequest 请求每次都给我不同的 UUID

ios - 如何将 CISampler 传递给基于 Metal 的 CIColorKernel?

ios - 在 iOS App 中添加 Metal 支持作为可选渲染

ios - UICollectionView 两个具有相同 View 的单元格。第二个单元格什么也没显示

opengl - 有没有办法在用三角形带绘制的网格上实现类似行进正方形的东西?

iphone - 字符串开头的 RegexKitLite 问题

使用 ASI 的 iOS 应用程序在将编译器切换到 Apple LLVM 后显示大量 'redefinition'

ios - 从图库中获取图像很慢

ios - 使用 Kingfisher 的 Swift iOS 照片采集会导致内存增长

ios - 在自定义单元格中实现倒计时器