我对委托方法didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection of 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发布于 2015-06-18 15:29:34
您的问题实际上是在Docs中引用的,特别是;
如果应用程序通过将提供的CMSampleBufferRef对象保留太长时间而导致样本丢失,但它需要长时间访问示例数据,请考虑将数据复制到新缓冲区中,然后释放示例缓冲区(如果以前保留的话),以便可以重用其引用的内存。
本质上,您需要保持回调操作尽可能简单,如果需要对在回调中传递给您的框架执行进一步的处理,则需要将其复制到新的缓冲区并在后台执行处理。此外,请记住,必须显式保留和释放对象。
另一个考虑因素是记忆压力。帧包含了大量的数据,过多的数据会导致应用程序崩溃。
发布于 2019-10-09 16:46:11
我在Xamarin(C#) iOS开发中遇到了类似的问题。使用以下代码发布CMSampleBuffer (如果在Xamarin中):
GC.Collect();
GC.WaitForPendingFinalizers();https://stackoverflow.com/questions/30850676
复制相似问题