7

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

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

这工作正常。但是,稍后停止会话:

[session stopRunning];

一般需要8秒左右!有谁知道为什么这是可能的以及可以做些什么来使它更快?

4

2 回答 2

4

从苹果文件:

讨论

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

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


添加更多评论:

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

于 2013-08-29T14:37:44.057 回答
3

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

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

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

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

于 2014-08-12T15:06:10.713 回答