【发布时间】:2021-10-31 01:02:17
【问题描述】:
我正在开发一个将像素缓冲区从广播上传扩展发送到 OpenTok 的应用程序。当我运行我的广播扩展时,它会在几秒钟内达到其内存限制。我一直在寻找减小 CMSampleBuffers 大小和规模的方法,并通过首先将它们转换为 CIImage,然后对其进行缩放,然后将它们转换为 CVPixelBuffers 以发送 OpenTok 服务器来结束该过程。不幸的是,即使我尝试减少像素缓冲区,扩展仍然崩溃。我的代码如下:
首先,我在 Sample Handler 的 processSampleBuffer 函数中将 CMSampleBuffer 转换为 CVPixelBuffer,然后将 CVPixelBuffer 和时间戳一起传递给我的函数。在这里,我将 CVPixelBuffer 转换为 cIImage 并使用 cIFilter(CILanczosScaleTransform) 对其进行缩放。之后,我使用 PixelBufferPool 和 cIContext 从 CIImage 生成像素缓冲区,然后使用 videoCaptureConsumer 将新缓冲区发送到 OpenTok 服务器。
func processPixelBuffer(pixelBuffer:CVPixelBuffer, timeStamp ts:CMTime) {
guard let ciImage = self.scaleFilterImage(inputImage: pixelBuffer.cmIImage, withAspectRatio: 1.0, scale: CGFloat(kVideoFrameScaleFactor)) else {return}
if self.pixelBufferPool == nil ||
self.pixelBuffer?.size != pixelBuffer.size{
self.destroyPixelBuffers()
self.updateBufferPool(newWidth: Int(ciImage.extent.size.width), newHeight: Int(ciImage.extent.size.height))
guard CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, self.pixelBufferPool, &self.pixelBuffer) == kCVReturnSuccess
else {return}
}
context?.render(ciImage, to:pixelBuffer)
self.videoCaptureConsumer?.consumeImageBuffer(pixelBuffer,
orientation:.up,
timestamp:ts,
metadata:nil)
}
如果 pixelBufferPool 为 nil 或 pixelBuffer 的大小发生变化,我会更新池。
private func updateBufferPool(newWidth: Int, newHeight: Int) {
let pixelBufferAttributes: [String: Any] = [
kCVPixelBufferPixelFormatTypeKey as String: UInt(self.videoFormat),
kCVPixelBufferWidthKey as String: newWidth,
kCVPixelBufferHeightKey as String: newHeight,
kCVPixelBufferIOSurfacePropertiesKey as String: [:]
]
CVPixelBufferPoolCreate(nil,nil, pixelBufferAttributes as NSDictionary?, &pixelBufferPool)
}
这是我用来缩放 cIImage 的函数:
func scaleFilterImage(inputImage:CIImage, withAspectRatio aspectRatio:CGFloat, scale:CGFloat) -> CIImage? {
scaleFilter?.setValue(inputImage, forKey:kCIInputImageKey)
scaleFilter?.setValue(scale, forKey:kCIInputScaleKey)
scaleFilter?.setValue(aspectRatio, forKey:kCIInputAspectRatioKey)
return scaleFilter?.outputImage
}
- 我的问题是为什么它仍然不断崩溃,是否有另一种方法可以减少 CVPixelBuffer 大小而不会导致内存限制崩溃?
我将不胜感激这方面的任何帮助。 Swift 或 Objective - C,我愿意接受所有建议。
【问题讨论】:
标签: ios core-image replaykit core-video video-toolbox