【问题标题】:AVCaptureOutput didOutputSampleBuffer stops getting calledAVCaptureOutput didOutputSampleBuffer 停止被调用
【发布时间】:2015-06-15 16:51:23
【问题描述】:

我对@9​​87654322@ 的委托方法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

【问题讨论】:

  • 如何创建和启动会话?你如何配置你的输出?您是否尝试为AVCaptureSessionRuntimeErrorNotification 通知设置观察者,会发生吗?如果您写入文件,会出现captureOutput:willFinishRecordingToOutputFileAtURL:fromConnections:dueToError: 吗?你能提供一些重现问题的示例项目吗?提供有关您的问题的更多信息。

标签: ios objective-c avfoundation avcapturesession


【解决方案1】:

你的问题其实是在Docs中引用的,具体来说;

如果您的应用程序通过保留 提供 CMSampleBufferRef 对象的时间过长,但它需要访问 长时间的样本数据,考虑复制 数据到一个新的缓冲区,然后释放样本缓冲区(如果它是 以前保留),以便它引用的内存可以被重用。

本质上,您需要保持回调操作尽可能简单,如果您需要对回调中传递给您的帧进行进一步处理,则需要将其复制到新缓冲区并在背景。另外,请记住,必须明确保留和释放 Core Foundation 对象。

另一个考虑因素是内存压力。帧包含大量数据,保留太多会导致您的应用崩溃。

【讨论】:

  • 哇,你让我摆脱了持续一个月的头痛,谢谢!
  • @MDB983 你能提供一些代码示例或教程吗?我一直在为这个问题苦苦挣扎,无法正确处理 sampleBuffer,在对 sampleBuffer 进行一些操作后,我的 SampleBufferDelegate 停止触发。
  • 如何复制?
  • @GustavoBaiocchiCosta 再次阅读 OP 的问题。答案解决了他的问题,不需要任何代码。如果您遇到问题,请发布问题,如果您问得好,也许有人会回复。这不是免费的编程服务!
【解决方案2】:

我在 Xamarin(C#) iOS 开发中遇到了类似的问题。使用以下代码在 Xamarin 中释放 CMSampleBuffer

GC.Collect();
GC.WaitForPendingFinalizers();

【讨论】:

  • 这为我解决了这个问题。我使用sampleBuffer 创建UIImage 然后调用sampleBuffer.Dispose(),但在大约6 个捕获帧后仍然导致丢帧。使用您的解决方案为我修复了它。谢谢。
猜你喜欢
  • 2022-01-04
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多