2013-07-03 6 views
5

ho creare una nuova sessione, e avviarlo su iPhone in questo modo:arresto AVCaptureSession iPhone dura 8 secondi

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

Questo funziona bene. Tuttavia, interrompendo la sessione in un secondo momento:

[session stopRunning]; 

Richiede circa 8 secondi in genere! Qualcuno sa perché questo è possibile e cosa si potrebbe fare per renderlo più veloce?

+1

Prova questo: http: //stackoverflow.com/questions/11905505/avcapturesession-stop-running-take-a-long-time – nickcheng

+1

Sì, questo sembra risolvere il problema. Quando lo aggiungi come risposta, lo accetto. –

risposta

2

Mi sono imbattuto in un problema simile. Chiamare stopRunning bloccherebbe l'app per 8-10 secondi.

Alla fine ho rintracciato il problema: stavo chiamando stopRunning su un thread diverso dal thread principale. Questo thread secondario è stato utilizzato per tutte le transazioni su AVCaptureSession. Il problema si è verificato perché dopo aver inviato la chiamata a stopRunning, ho bloccato il thread principale in attesa del completamento. Sfortunatamente, stopRunning invia qualcosa al thread principale e blocca l'attesa del completamento. La cosa stopRunning era in attesa alla fine scaduta e segnalato un errore nel - (void) onRuntimeError: (NSNotification *) n callback: Error Domain = AVFoundationErrorDomain Code = -11819 "Can not Complete Action" UserInfo = 0x19e43c90 {NSLocalizedRecoverySuggestion = Riprova più tardi. NSLocalizedDescription = Impossibile completare l'azione}

La soluzione nel mio caso era semplicemente non bloccare il thread principale dopo aver chiamato stopRunning. Fortunatamente per me è stato facile (e qualcosa che Apple raccomanda più o meno comunque).

Ho notato variazioni su questo tema in altre domande e la soluzione è sempre stata quella di rielaborare il codice. Speriamo che questo fornisca una migliore comprensione del perché il problema si sta verificando.

+0

Questo mi ha portato a notare che stavo chiamando startRunning() nella mia app fuori dal thread principale che causava un lungo ritardo prima dell'avvio della sessione. L'ho modificato per funzionare sul thread principale e funziona di nuovo bene. –

3

Dai documenti di 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.

Perché è sincrona, si può mettere in una chiamata asincrona per evitare il congelamento thread UI.


aggiunta più commenti:

L'idea di cui sopra non ha fatto stopRunning più veloce. Basta interrompere il congelamento del thread dell'interfaccia utente.