AVCaptureOutput didOutputSampleBuffer停止调用

时间:2015-06-15 16:51:23

标签: ios objective-c avfoundation avcapturesession

我对didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection的委托方法AVCaptureOutput存在问题。

当我将sampleBuffer添加到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);
    }
}

控制台输出:

// 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

2 个答案:

答案 0 :(得分:11)

您的问题实际上是在Docs,具体而言;

中引用的
  

如果您的应用程序通过保留应用程序导致丢弃样本   提供CMSampleBufferRef对象的时间太长,但需要访问权限   对于样本数据很长一段时间,考虑复制   将数据放入新缓冲区,然后释放样本缓冲区(如果是的话)   之前保留的)以便它可以重用它引用的内存。

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

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

答案 1 :(得分:0)

我在Xamarin(C#)iOS开发中遇到类似的问题。如果在Xamarin中,请使用以下代码释放CMSampleBuffer

GC.Collect();
GC.WaitForPendingFinalizers();