AVFoundation 无法将实时 CMSample 缓冲区存储到数组中

问题描述 投票:0回答:1

我修改了这个Apple示例代码AVcam,我想做的是将最新的20个CMSampleBuffer存储到一个数组中。

我在

AVCaptureVideoDataOutputSampleBufferDelegate
中添加一个
CameraViewController
协议,创建一个新的
VideoDataOutput
并连接它。然后将委托设置为 self。

在回调函数中

var bufferArray:[CMSampleBuffer] = []
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        if bufferArray.count > 20{
           bufferArray.removeFirst()
         }
         bufferArray.append(sampleBuffer)
    }

但是调用它5-10次后(基于会话的预设),它就不会再调用它了。在我的另一个相机应用程序中,预览也卡住了。

奇怪的是,如果我只持有缓冲区的一个引用,就像将代码更改为

singlebuffer = sampleBuffer
,一切正常。我更改了许多捕获设置,但没有一个起作用。

更新: 在diddrop回调函数中,显示了原因

DroppedFrameReason(P) = OutOfBuffers
,苹果文档是这样说的:

提供样本缓冲区的模块已用完源缓冲区。这种情况通常是由于客户端持有缓冲区时间过长引起的,可以通过将缓冲区返回给提供者来缓解。

ios swift camera uikit avfoundation
1个回答
0
投票

我尝试将缓冲区转换为 CVPixelBuffer、CIImage、CGImage

        let image = CIImage(cvPixelBuffer: CMSampleBufferGetImageBuffer(cmsampleBuffer)!)
        create cgimage
        let context = CIContext(options: nil)
        let cgImage = context.createCGImage(image, from: image.extent)
        liveArray.append(cgImage!)
    }

在转换为 CGImage 之前,该变量不再保存缓冲区的引用。

© www.soinside.com 2019 - 2024. All rights reserved.