AVCaptureOutput didOutputSampleBuffer不再被调用

问题描述 投票:5回答:2

我对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
ios objective-c avfoundation avcapturesession
2个回答
12
投票

您的问题实际上是在Docs中实际引用的;

如果您的应用通过保留提供的CMSampleBufferRef对象时间过长,但需要访问到很长一段时间的样本数据,请考虑复制数据放入新缓冲区,然后释放样本缓冲区(如果已以前保留的),以便可以重用它引用的内存。

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

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


0
投票

我遇到类似的问题。使用以下代码释放CMSampleBuffer

GC.Collect();
GC.WaitForPendingFinalizers();
© www.soinside.com 2019 - 2024. All rights reserved.