栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从CMSampleBuffer中提取数据以创建深层副本

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从CMSampleBuffer中提取数据以创建深层副本

好吧,我想我终于明白了。我创建了一个辅助扩展程序来制作的完整副本

CVPixelBuffer

extension CVPixelBuffer {    func copy() -> CVPixelBuffer {        precondition(CFGetTypeID(self) == CVPixelBufferGetTypeID(), "copy() cannot be called on a non-CVPixelBuffer")        var _copy : CVPixelBuffer?        CVPixelBufferCreate( nil, CVPixelBufferGetWidth(self), CVPixelBufferGetHeight(self), CVPixelBufferGetPixelFormatType(self), CVBufferGetAttachments(self, kCVAttachmentMode_ShouldPropagate)?.takeUnretainedValue(), &_copy)        guard let copy = _copy else { fatalError() }        CVPixelBufferLockbaseAddress(self, kCVPixelBufferLock_ReadOnly)        CVPixelBufferLockbaseAddress(copy, 0)        for plane in 0..<CVPixelBufferGetPlaneCount(self) { let dest = CVPixelBufferGetbaseAddressOfPlane(copy, plane) let source = CVPixelBufferGetbaseAddressOfPlane(self, plane) let height = CVPixelBufferGetHeightOfPlane(self, plane) let bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(self, plane) memcpy(dest, source, height * bytesPerRow)        }        CVPixelBufferUnlockbaseAddress(copy, 0)        CVPixelBufferUnlockbaseAddress(self, kCVPixelBufferLock_ReadOnly)        return copy    }}

现在您可以在您的

didOutputSampleBuffer
方法中使用它:

guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }let copy = pixelBuffer.copy()toProcess.append(copy)

但是请注意,一个这样的pixelBuffer会占用大约3MB的内存(1080p),这意味着在100帧中您已经拥有了300MB的内存,这大约是iPhone所说的STAHP(并崩溃)的时间。

请注意,您实际上并不想复制,

CMSampleBuffer
因为它实际上只包含一个,
CVPixelBuffer
因为它是一个图像。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号