问题描述
我从 AVCaptureSynchronizedDataCollection 获取深度数据流,并尝试异步处理 depthDataMap。我试图深度复制 CVPixelBuffer,因为我不想在处理时阻塞相机,但复制的缓冲区似乎不正确,因为我不断收到错误的访问错误。这是我用来深度复制 CVPixelBuffer 的代码:
func duplicatePixelBuffer(input: CVPixelBuffer) -> CVPixelBuffer {
var copyOut: CVPixelBuffer?
let bufferWidth = CVPixelBufferGetWidth(input)
let bufferHeight = CVPixelBufferGetHeight(input)
let bytesPerRow = CVPixelBufferGetBytesPerRow(input)
let bufferFormat = CVPixelBufferGetPixelFormatType(input)
_ = CVPixelBufferCreate(kcfAllocatorDefault,bufferWidth,bufferHeight,bufferFormat,CVBufferGetAttachments(input,CVAttachmentMode.shouldPropagate),©Out)
let output = copyOut!
// Lock the depth map base address before accessing it
CVPixelBufferLockBaseAddress(input,CVPixelBufferLockFlags.readOnly)
CVPixelBufferLockBaseAddress(output,CVPixelBufferLockFlags.readOnly)
let baseAddress = CVPixelBufferGetBaseAddress(input)
let baseAddresscopy = CVPixelBufferGetBaseAddress(output)
memcpy(baseAddresscopy,baseAddress,bufferHeight * bytesPerRow)
// Unlock the base address when finished accessing the buffer
CVPixelBufferUnlockBaseAddress(input,CVPixelBufferLockFlags.readOnly)
CVPixelBufferUnlockBaseAddress(output,CVPixelBufferLockFlags.readOnly)
NSLog("Pixel buffer original: \(input)")
NSLog("Pixel buffer copy: \(output)")
return output
}
我在返回之前检查了两个 CVPixelBuffer 对象,似乎复制的缓冲区没有 iosurface。另外,原始文件中的propagatedAttachments 中有一个MetadataDictionary 对象,但副本中的MetadataDictionary 对象直接位于属性中。
我在 Stack Overflow 上尝试了一些其他解决方案,但没有成功,因为我的飞机是非平面的。希望对此有任何见解,或者我是否应该完全尝试不同的方法。谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)