AVCaptureOutput didOutputSampleBuffer停止调用

klc*_*r89 5 objective-c avfoundation ios avcapturesession

我有委托方法didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection的问题AVCaptureOutput.

当我将sampleBuffer添加到a时,它会在一两秒内停止调用CFArray.如果我删除CFArray代码,委托方法继续被调用,所以我不知道为什么CFArray代码导致它停止.我很感激任何帮助.

@property CFMutableArrayRef sampleBufferArray;

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    NSLog(@"Called");

    if (!self.sampleBufferArray)
    {
        self.sampleBufferArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
        CFArrayAppendValue(self.sampleBufferArray, sampleBuffer);
    }
    else
    {
        CFArrayAppendValue(self.sampleBufferArray, sampleBuffer);
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

// Session start
2015-06-15 13:06:07.264 App[22467:5897858] Called
2015-06-15 13:06:07.286 App[22467:5897858] Called
2015-06-15 13:06:07.289 App[22467:5897858] Called
2015-06-15 13:06:07.315 App[22467:5897895] Called
2015-06-15 13:06:07.366 App[22467:5897895] Called
2015-06-15 13:06:07.384 App[22467:5897895] Called
2015-06-15 13:06:07.411 App[22467:5897895] Called
2015-06-15 13:06:07.449 App[22467:5897858] Called
2015-06-15 13:06:07.480 App[22467:5897858] Called
2015-06-15 13:06:07.513 App[22467:5897895] Called
2015-06-15 13:06:07.546 App[22467:5897895] Called
2015-06-15 13:06:07.579 App[22467:5897895] Called
2015-06-15 13:06:07.614 App[22467:5897895] Called
// No more calls after this point
Run Code Online (Sandbox Code Playgroud)

MDB*_*983 12

您的问题实际上是在文档中引用的,具体而言;

如果您的应用程序通过保留提供的CMSampleBufferRef对象太久而导致丢弃样本,但需要长时间访问样本数据,请考虑将数据复制到新缓冲区中,然后释放样本缓冲区(如果它以前保留过)以便它引用的内存可以重用.

实质上,您需要保持回调操作尽可能简单,如果您需要对回调中传递给您的帧执行进一步处理,则需要将其复制到新缓冲区并在后台执行处理.此外,请记住,必须明确保留和释放Core Foundation对象.

进一步的考虑是记忆压力.框架包含大量数据,保留太多会导致您的应用程序崩溃.