求助:调用CVPixelBufferGetBaseAddressOfPlane始终返回Nil问题
解决CVPixelBufferGetBaseAddressOfPlane返回Nil的问题
嘿,我之前也踩过这个一模一样的坑!明明确认CVVideoPixelBuffer本身不是nil,但调用CVPixelBufferGetBaseAddressOfPlane就是返回nil,大概率是以下几个原因导致的,给你逐个排查:
没有锁定像素缓冲区的内存
CVPixelBuffer的内存通常是延迟分配的,而且访问前必须先锁定,否则系统不会把内存地址暴露给你。你需要先调用锁定方法,用完后记得解锁避免内存泄漏:// 先以只读模式锁定缓冲区(如果需要写入就用.readWrite) CVPixelBufferLockBaseAddress(cvPixelBuffer, CVPixelBufferLockFlags.readOnly) defer { // 用defer确保代码执行完后一定会解锁 CVPixelBufferUnlockBaseAddress(cvPixelBuffer, CVPixelBufferLockFlags.readOnly) } // 现在再尝试获取baseAddress let baseAddress = CVPixelBufferGetBaseAddressOfPlane(cvPixelBuffer, 0)检查像素格式的平面数量
有些像素格式是单平面的(比如kCVPixelFormatType_32BGRA),虽然理论上CVPixelBufferGetBaseAddressOfPlane(cvPixelBuffer, 0)也能拿到地址,但更稳妥的是先确认平面数量:let planeCount = CVPixelBufferGetPlaneCount(cvPixelBuffer) if planeCount > 0 { let baseAddress = CVPixelBufferGetBaseAddressOfPlane(cvPixelBuffer, 0) } else { // 单平面格式直接用这个 let baseAddress = CVPixelBufferGetBaseAddress(cvPixelBuffer) }确认缓冲区内存已分配
极少数情况下,即使缓冲区存在,内存可能还没被系统分配。锁定操作会触发内存分配,所以第一步的锁定步骤几乎是必做的。
你可以先试试加锁的代码,这应该是最常见的解决办法!
内容的提问来源于stack exchange,提问作者btomtom5
相关产品推荐
相关产品推荐

