2013-07-03 20 views
5

utworzyć nową sesję, i uruchomić go na iPhone tak:zatrzymanie AVCaptureSession iPhone trwa 8 sekund

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

To działa prawidłowo. Jednak zatrzymanie sesji później:

[session stopRunning]; 

Zwykle trwa około 8 sekund! Czy ktoś wie, dlaczego jest to możliwe i co można zrobić, aby przyspieszyć?

+1

Spróbuj tego: http: //stackoverflow.com/questions/11905505/avcapturesession-stop-running-take-a-long-long-time – nickcheng

+1

Tak, wydaje się, że to rozwiązuje problem. Gdy dodasz go jako odpowiedź, zaakceptuję to. –

Odpowiedz

2

Wpadłem na podobny problem. Wywołanie stopRunning spowoduje zatrzymanie aplikacji na 8 do 10 sekund.

W końcu wyśledziłem problem do tego: Nazwałem stopRunning na wątku innym niż główny wątek. Ten wtórny wątek został użyty do wszystkich transakcji do AVCaptureSession. Wystąpił problem, ponieważ po wysłaniu wywołania stopRunning zablokowałem główny wątek oczekujący na zakończenie. Niestety stopRunning wysyła coś do głównego wątku i bloków czekających na zakończenie. Sprawa stopRunning kończyła się i upłynęła limit czasu i zgłoszono błąd w wywołaniu zwrotnym - (void) onRuntimeError: (NSNotification *) n: Domena błędu = AVFoundationErrorDomain Code = -11819 "Nie można ukończyć działania" UserInfo = 0x19e43c90 {NSLocalizedRecoverySuggestion = Spróbuj ponownie później., NSLocalizedDescription = Nie można ukończyć działania}

Rozwiązaniem w moim przypadku było po prostu zablokowanie głównego wątku po wywołaniu stopRunning. Na szczęście dla mnie to było łatwe (i coś, co Apple mniej lub bardziej zaleca).

Zauważyłem wariacje na ten temat w innych kwestiach, a rozwiązaniem zawsze była zmiana kodu. Mam nadzieję, że pozwoli to lepiej zrozumieć, dlaczego występuje problem.

+0

To doprowadziło mnie do zauważenia, że ​​wywołałem startRunning() w mojej aplikacji z głównego wątku, który powodował duże opóźnienie przed rozpoczęciem sesji. Zmieniłem go, aby działał na głównym wątku i znów działa poprawnie. –

3

Z dokumentów 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.

Bo to synchroniczny, można umieścić go do wywołania asynchronicznego aby uniknąć zamrażania wątku UI.


Dodajesz więcej komentarzy:

Pomysł powyżej nie sprawiają stopRunning szybciej. Po prostu przestaje zamrażać wątek interfejsu użytkownika.