2013-07-03 23 views
5

我创建一个新的会话,并启动它在iPhone上是这样的:停止AVCaptureSession iPhone需要8秒

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

这工作得很好。但是,稍后停止会话:

[session stopRunning]; 

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

+1

试试这个:http://stackoverflow.com/questions/11905505/avcapturesession-stop-running-take-a-long-long-time – nickcheng

+1

是的,这似乎解决了这个问题。当您将其添加为答案时,我会接受它。 –

回答

2

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

我终于找到了这个问题这样的:我是除主线程以外的线程调用stopRunning。此辅助线程用于AVCaptureSession的所有事务。发生此问题是因为调度调用stopRunning后,我堵住了主线程等待它完成。不幸的是,stopRunning发布了一些主线程和块等待,要完成。事情stopRunning在等待最终超时,并报告在一个错误 - (空)onRuntimeError:(NSNotification *)N回调: 错误域= AVFoundationErrorDomain代码= -11819“无法完成操作”的UserInfo = 0x19e43c90 {NSLocalizedRecoverySuggestion =再试一次后来,NSLocalizedDescription =无法完成行动}

在我的情况的解决方案是在调用stopRunning后根本就没有阻塞主线程。幸运的是,这是很容易做到(和苹果的东西或多或少建议反正)。

我注意到有关这一主题的其他问题的变化,以及解决方案一直是返工的代码。希望这将有助于更好地理解为什么这个问题发生的。

+0

这使我注意到,我在我的应用程序关闭这是造成长时间的延迟在会议开始之前,主线程调用startRunning()。我改变它在主线程上运行,它再次正常工作。 –

3

从Apple文件:

Discussion

This method is used to stop the flow of data from the inputs to the outputs connected to the AVCaptureSession instance that is the receiver. This method is synchronous and blocks until the receiver has completely stopped running.

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


添加更多的评论:

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