停止AVCaptureSession iPhone需要8秒钟

Jan*_*egg 7 iphone camera ios avcapturesession

我创建了一个新会话,并在iPhone上启动它,如下所示:

AVCaptureSession* session;
...
[session startRunning];
Run Code Online (Sandbox Code Playgroud)

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

[session stopRunning];
Run Code Online (Sandbox Code Playgroud)

通常需要8秒!有谁知道为什么这是可能的,有什么办法可以让它更快?

小智 3

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

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

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

我在其他问题中注意到这个主题的变化,解决方案始终是重新编写代码。希望这能让您更好地理解问题发生的原因。