我对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
您的问题实际上是在Docs中实际引用的;
如果您的应用通过保留提供的CMSampleBufferRef对象时间过长,但需要访问到很长一段时间的样本数据,请考虑复制数据放入新缓冲区,然后释放样本缓冲区(如果已以前保留的),以便可以重用它引用的内存。
基本上,您需要使回调操作尽可能简单,并且需要对回调中传递给您的帧执行进一步的处理,您需要将其复制到新的缓冲区中并在后台执行处理。另外,请记住,必须明确保留和释放Core Foundation对象。
进一步的考虑是记忆压力。框架包含大量数据,保留太多数据将导致您的应用崩溃。
我遇到类似的问题。使用以下代码释放CMSampleBuffer
:
GC.Collect();
GC.WaitForPendingFinalizers();