停止AVCaptureSession iPhone需要8秒钟

停止AVCaptureSession iPhone需要8秒钟,iphone,ios,camera,avcapturesession,Iphone,Ios,Camera,Avcapturesession,我创建了一个新会话,并在iPhone上启动它,如下所示: AVCaptureSession* session; ... [session startRunning]; 这个很好用。但是,请稍后停止会话: [session stopRunning]; 通常需要8秒左右!有人知道为什么这是可能的,以及可以做些什么来加快速度吗?来自苹果文档: 讨论 此方法用于停止从输入到连接到作为接收器的AVCaptureSession实例的输出的数据流。此方法是同步的,并且阻塞,直到接收器完全停止运行 因为它是

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

AVCaptureSession* session;
...
[session startRunning];
这个很好用。但是,请稍后停止会话:

[session stopRunning];

通常需要8秒左右!有人知道为什么这是可能的,以及可以做些什么来加快速度吗?

来自苹果文档:

讨论

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

因为它是同步的,所以可以将其放入异步调用中,以避免冻结UI线程


添加更多评论:


上述想法并没有使
停止运行
更快。它只是停止冻结UI线程。

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

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

在我的例子中,解决方案是在调用stopRunning后不阻塞主线程。幸运的是,这对我来说很容易做到(而且苹果或多或少都推荐了这一点)


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

试试这个:是的,这似乎能解决问题。当你添加它作为答案时,我会接受它。这让我注意到我在应用程序中调用startRunning()时脱离了主线程,这导致会话开始前的长时间延迟。我把它改为在主线程上运行,它又正常工作了。