我正在尝试对 CVPixelBuffer
进行深度复制。我收到错误 kCVReturnInvalidArgument
或值 -661。我已经验证了每个参数的类型和数组的长度,但我找不到我编码错误的地方。我希望有人会发现它。
代码如下:
func clonePixelBuffer(pixelBuffer: CVPixelBuffer) -> CVPixelBuffer? {
CVPixelBufferLockBaseAddress(pixelBuffer, 0)
let height = CVPixelBufferGetHeight(pixelBuffer)
let width = CVPixelBufferGetWidth(pixelBuffer)
let numberOfPlanes = CVPixelBufferGetPlaneCount(pixelBuffer)
var planeBaseAddresses = [UnsafeMutablePointer<Void>]()
var planeWidths = [Int]()
var planeHeights = [Int]()
var planeBytesPerRows = [Int]()
for i in 0..<numberOfPlanes {
planeBaseAddresses.append(CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0))
planeWidths.append(CVPixelBufferGetWidthOfPlane(pixelBuffer, i))
planeHeights.append(CVPixelBufferGetHeightOfPlane(pixelBuffer, i))
planeBytesPerRows.append(CVPixelBufferGetHeightOfPlane(pixelBuffer, i))
}
let newPixelBuffer = UnsafeMutablePointer<CVPixelBuffer?>()
let status = CVPixelBufferCreateWithPlanarBytes(nil, width, height, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, nil, 0, numberOfPlanes, &planeBaseAddresses, &planeWidths, &planeHeights, &planeBytesPerRows, nil, nil, nil, newPixelBuffer)
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0)
if status == noErr { <------ status = -6661
return newPixelBuffer.memory
}
return nil
}
最佳答案
不确定是不是这样,但是 bytesPerRows 行上有一个复制粘贴错误——它说
planeBytesPerRows.append(CVPixelBufferGetHeightOfPlane(pixelBuffer, i))
但应该是
planeBytesPerRows.append(CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, i))
您也可以转发 FormatType 而不是对其进行硬编码。
据我了解 CVPixelBufferRef,这实际上不会复制像素缓冲区的数据,只是将一个 PixelBuffer 中的数据引用到另一个 PixelBuffer 中的数据。您需要为平面分配您自己的内存区域,引用该范围内的数据,然后在 CVPixelBufferRef 被销毁后向该内存提供一个 Free 回调函数 free()
。
关于ios - CVPixelBufferCreateWithPlanarBytes 返回 -6661 (kCVReturnInvalidArgument),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742167/