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