ios - CVPixelBufferCreateWithPlanarBytes 返回 -6661 (kCVReturnInvalidArgument)

标签 ios swift avfoundation core-video

我正在尝试对 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/

相关文章:

ios - 从 Objective-C 文件中的 AppDelegate.swift 访问 UIWindow

ios - 协议(protocol)不适用于容器

iphone - 需要有关iOS崩溃日志的帮助

ios - viewDidLoad 每次加载

objective-c - 对 WCF REST 服务的 AFNetworking JSON 请求

objective-c - SwiftUI:如何在 Objective-C 中获取窗口

ios - 可视化点击 View ,显示点击指示器

ios - 一些 iOS 设备没有声音

ios - AVAssetReader 以低质量播放 MPMediaItem?

ios - Objective-C 将 block 类型转换为另一个 block 类型得到了意想不到的结果