【问题标题】:Converting CMSampleBuffer to CVMetalTexture in Swift with CVMetalTextureCacheCreateTextureFromImage使用 CVMetalTextureCacheCreateTextureFromImage 在 Swift 中将 CMSampleBuffer 转换为 CVMetalTexture
【发布时间】:2015-06-30 20:18:25
【问题描述】:

我正在尝试建立一个简单的渲染相机输出到金属层的管道,它在 Objective-C 中运行良好(有 MetalVideoCapture 示例应用程序),但似乎有一些格式奇怪的时候我试着把它翻译成swift。我的超简单捕获缓冲区看起来像这样(忽略缺乏清理...)

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
    var error: CVReturn! = nil
    let sourceImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
    let width = CVPixelBufferGetWidth(sourceImageBuffer!)
    let height = CVPixelBufferGetHeight(sourceImageBuffer!)
    var outTexture: CVMetalTextureRef? = nil

    error  = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, videoTextureCache!, sourceImageBuffer!, nil, MTLPixelFormat.BGRA8Unorm, width, height, 0, &outTexture!)

    if error != nil {
        print("Error! \(error)")
    }

    let videoTexture = CVMetalTextureGetTexture(outTexture!)
    self.imageTexture = videoTexture!
}

videoTextureCache 在哪里var videoTextureCache: CVMetalTextureCache? = nil

但它给了我Cannot invoke 'CVMetalTextureCacheCreateTextureFromImage' with an argument list of type '(CFAllocator!, CVMetalTextureCache, CVImageBuffer, nil, MTLPixelFormat, Int, Int, Int, inout CVMetalTextureRef)'

问题是,如果我将 outTexture 替换为 nil,它将停止抛出错误,但显然这对我没有帮助。根据函数的参考,我需要 UnsafeMutablePointer?> 作为最后一个值。我不确定如何获得。

【问题讨论】:

    标签: swift avfoundation metal


    【解决方案1】:

    尽量提前分配你的textureCache,这里是我用的成员变量:

    var _videoTextureCache : Unmanaged<CVMetalTextureCacheRef>?
    

    然后我通过初始化方法分配纹理缓存

    CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, _context.device, nil, &_videoTextureCache)
    

    其中 _context.device 是 MTLDevice。然后,在 captureOutput 方法中,我使用以下内容(注意,这里不包含错误检查)

    var textureRef : Unmanaged<CVMetalTextureRef>?
    CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _videoTextureCache!.takeUnretainedValue(), imageBuffer, nil, MTLPixelFormat.BGRA8Unorm, width, height, 0, &textureRef)
    

    我希望这会有所帮助!

    【讨论】:

    • 太棒了!我也一直在为此苦苦挣扎-为此感谢一百万:)
    • 这个答案已经过时了。请参阅@XueYu 对 Swift 3 和 Swift 4 的回答。
    【解决方案2】:

    更新@peacer212 对 Swift 3 的回答。

    您不再需要UnmanagedtakeUnretainedValue。所以代码应该是:

    var textureCache: CVMetalTextureCache?
    
    ...
    CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, _context.device, nil, &_videoTextureCache)
    
    ...
    
    var textureRef : CVMetalTexture?
    CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache!, imageBuffer, nil, .bgra8Unorm, width, height, 0, & textureRef)
    

    【讨论】:

    • 什么是videoTextureCache?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多