为什么我一次不能读取超过12个CVPixelBuffers?

时间:2019-03-03 00:11:48

标签: ios swift metal metalkit cvpixelbuffer

我正在iOS(使用Metal)上制作视频效果,该效果要求访问当前视频帧以及一定数量的先前帧中的像素数据。为此,我将像素缓冲区存储在行为类似于堆栈的Array属性中。渲染时,我循环遍历像素缓冲区并为每个像素创建一个MTLTexture。然后,这些纹理将作为texture2d_array发送到我的Metal着色器。

一切都很好,除了一次尝试从超过12个不同的像素缓冲区显示数据时,捕获的输出中不再发送新帧,并且视频似乎冻结了。没有警告或崩溃。我一直在使用iPhone 8。

尽管我无法确定该限制的性质,但似乎正在达到一个明确的限制。我是图形编程的新手,所以我可能做得不好。对于任何帮助或想法,我将深表感谢。

这是我的像素缓冲区堆栈:

// number of pixel buffers, anything over 12 causes "freeze"
let maxTextures = 12
var pixelBuffers: [CVPixelBuffer]?
var pixelBuffer: CVPixelBuffer? {
    set {
        if pixelBuffers == nil {
            pixelBuffers = Array(repeating: newValue!, count: maxTextures)
        }

        pixelBuffers!.append(newValue!)
        pixelBuffers!.removeFirst()

        DispatchQueue.main.async {
            self.setNeedsDisplay()
        }
    }
    get {
        return pixelBuffers?.last
    }
}

在这里创建纹理:

for i in 0..<maxTextures {

    guard let pixelBuffer = self.pixelBuffers?[i] else { return }

    width = CVPixelBufferGetWidth(pixelBuffer)
    height = CVPixelBufferGetHeight(pixelBuffer)

    var cvTextureOut: CVMetalTexture?
    CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, self.textureCache!, pixelBuffer, nil, .bgra8Unorm, width, height, 0, &cvTextureOut)
    guard let cvTexture = cvTextureOut else {
        print("Failed to create metal texture")
        return
    }

    if textures == nil {
        textures = Array(repeating: CVMetalTextureGetTexture(cvTexture)!, count: maxTextures)
    }

    textures![i] = CVMetalTextureGetTexture(cvTexture)!

}

在上下文中查看此代码:https://gist.github.com/peeinears/5444692079d011a0ca3947c4e49efd47

如果有帮助,我很乐意分享更多信息。

谢谢!

0 个答案:

没有答案