【问题标题】:stopping AVCaptureSession iPhone takes 8 seconds停止 AVCaptureSession iPhone 需要 8 秒
【发布时间】:2013-07-03 07:55:15
【问题描述】:

我创建一个新会话,并在 iPhone 上像这样启动它:

AVCaptureSession* session;
...
[session startRunning];

这很好用。但是,稍后停止会话:

[session stopRunning];

通常需要大约 8 秒!有谁知道为什么这是可能的以及可以做些什么来使它更快?

【问题讨论】:

标签: iphone ios camera avcapturesession


【解决方案1】:

来自 Apple 文档:

讨论

此方法用于停止从输入到连接到作为接收器的 AVCaptureSession 实例的输出的数据流。此方法是同步的并阻塞,直到接收器完全停止运行。

因为它是同步的,你可以把它放到一个异步调用中来避免冻结 UI 线程。


添加更多 cmets:

上面的想法并没有让stopRunning 更快。它只是停止冻结 UI 线程。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。调用 stopRunning 会冻结应用 8 到 10 秒。

    我最终找到了这个问题:我在主线程以外的线程上调用了 stopRunning。此辅助线程用于 AVCaptureSession 的所有事务。出现问题是因为在调度 stopRunning 调用后,我阻塞了等待它完成的主线程。不幸的是,stopRunning 向主线程发布一些内容并阻塞等待它完成。 stopRunning 等待的东西最终超时并在 - (void)onRuntimeError:(NSNotification*)n 回调中报告了错误: Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo=0x19e43c90 {NSLocalizedRecoverySuggestion=稍后再试。, NSLocalizedDescription=Cannot Complete Action}

    在我的情况下,解决方案是在调用 stopRunning 之后不阻塞主线程。对我来说幸运的是,这很容易做到(无论如何,Apple 或多或少都会推荐)。

    我注意到其他问题中这个主题的变化,解决方案一直是重新编写代码。希望这将有助于更好地了解问题发生的原因。

    【讨论】:

    • 这让我注意到我在我的应用程序中从主线程调用 startRunning(),这导致会话开始前有很长的延迟。我将其更改为在主线程上运行,它又可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多