我对委托方法有疑问didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
of AVCaptureOutput
.
当我将sampleBuffer添加到a中时,它会在一两秒内停止被调用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 https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureVideoDataOutputSampleBufferDelegate_Protocol/index.html#//apple_ref/occ/intfm/AVCaptureVideoDataOutputSampleBufferDelegate/captureOutput:didOutputSampleBuffer:fromConnection:, 具体来说;
如果您的应用程序通过保留
提供 CMSampleBufferRef 对象太久,但需要访问
对于很长一段时间的样本数据,可以考虑复制
数据到一个新的缓冲区,然后释放样本缓冲区(如果它是
先前保留的),以便可以重用它引用的内存。
本质上,您需要使回调操作尽可能简单,并且如果您需要对回调中传递给您的帧执行进一步处理,则需要将其复制到新的缓冲区并在后台执行处理。另外,请记住,必须显式保留和释放 Core Foundation 对象。
进一步考虑的是内存压力。框架包含大量数据,保留太多数据会导致您的应用程序崩溃。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)