AVCaptureOutput didOutputSampleBuffer停止调用
我有一个与didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
方法didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
的问题。
当我将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
您的问题实际上是在“ 文档”中引用的。
如果您的应用程序因保留提供的CMSampleBufferRef对象太长而导致样本丢失,但需要长时间访问样本数据,请考虑将数据复制到新缓冲区,然后释放样本缓冲区(如果它以前保留),以便它所引用的内存可以被重用。
从本质上讲,您需要尽可能简化callback操作,并且如果您需要对callback中传递给您的框架执行进一步处理,则需要将其复制到新的缓冲区中,并在后台执行处理。 另外,请记住,核心基础对象必须明确保留和释放。
进一步的考虑是内存压力。 框架包含大量的数据,保留太多会导致您的应用程序崩溃。