我创建了一个新会话,并像这样在 iPhone 上启动它:
AVCaptureSession* session;
...
[session startRunning];
这工作正常。但是,稍后停止会话:
[session stopRunning];
一般需要8秒左右!有谁知道为什么这是可能的以及可以做些什么来使它更快?
我创建了一个新会话,并像这样在 iPhone 上启动它:
AVCaptureSession* session;
...
[session startRunning];
这工作正常。但是,稍后停止会话:
[session stopRunning];
一般需要8秒左右!有谁知道为什么这是可能的以及可以做些什么来使它更快?
从苹果文件:
讨论
此方法用于停止从输入到连接到作为接收器的 AVCaptureSession 实例的输出的数据流。这个方法是同步的并且阻塞直到接收器完全停止运行。
因为它是同步的,你可以把它放到异步调用中来避免冻结 UI 线程。
添加更多评论:
上面的想法并没有变得stopRunning
更快。它只是停止冻结 UI 线程。
我遇到了类似的问题。调用 stopRunning 将冻结应用程序 8 到 10 秒。
我最终找到了这个问题:我在主线程以外的线程上调用 stopRunning。此辅助线程用于 AVCaptureSession 的所有事务。出现问题是因为在调度 stopRunning 调用后,我阻塞了等待它完成的主线程。不幸的是,stopRunning 向主线程发布一些内容并阻塞等待它完成。stopRunning 等待的事情最终超时并在 - (void)onRuntimeError:(NSNotification*)n 回调中报告错误:错误域 = AVFoundationErrorDomain 代码 = -11819 “无法完成操作” UserInfo = 0x19e43c90 {NSLocalizedRecoverySuggestion = 稍后再试., NSLocalizedDescription=无法完成动作}
我的解决方案是在调用 stopRunning 之后不阻塞主线程。对我来说幸运的是,这很容易做到(无论如何苹果或多或少都会推荐)。
我注意到其他问题中这个主题的变化,解决方案一直是重新编写代码。希望这将有助于更好地理解问题发生的原因。