2011-10-13 10 views
6

Ho implementato una fotocamera utilizzando il framework AVFoundation fornito in iOS 4 & 5, ma hanno sperimentato un problema incompatibile con la funzione captureStillImageAsynchronouslyFromConnection:completionHandler: in cui il blocco del gestore di completamento non viene mai chiamato. Il suono dell'otturatore non si attiva e l'anteprima si blocca in questa situazione.iOS AVFoundation captureStillImageAsynchronouslyFromConnection: completionHandler: Hanging indeterminato

Ho seguito sia Apple (WWDC 2010 & 2011 video) che guide non Apple (post di blog e SO) per implementare un'acquisizione di immagini fisse con risoluzione Photo con poco o nessun miglioramento. Sono stato in grado di riprodurre in qualche modo coerente con le seguenti condizioni :

  • Se ho impostato il flash a AVCaptureFlashModeAuto e scattare una foto in condizioni di scarsa luce, si blocca e viene eseguito il blocco di completamento mai. Il flash scatta, ma il suono dell'otturatore no. Con lo stesso codice sono in grado di scattare una foto alla luce normale in cui il suono dello scatto scatta, il flash no e il blocco di completamento viene eseguito.
  • Se non si imposta flashMode o impostato su off, sono in grado di scattare alcune foto, ma dopo un piccolo numero (tra 1 e 5, in genere) il blocco di completamento interrompe l'attivazione. Per chiarimenti, uno scenario potrebbe essere:
    1. scattare una foto e visualizzare lo schermo di conferma
    2. Torna a prendere schermo foto
    3. Ripetere 1 & 2 un paio di volte
    4. Hit scattare una foto e si blocca prima del blocco di completamento.

mia implementazione

ho l'interfaccia trattati in ViewController e classe separata per gestire tutte le cose AVFoundation. Una variabile di istanza della classe separata che gestisce la roba AVFoundation si trova nel ViewController. È diverso dalle implementazioni di esempio, ma non vedo perché dovrebbe causare questo tipo di bug occasionale.

più osservazioni

  • Anche al momento del check [stillImageOutput isCapturingStillImage], continuerà a return false e continuare a eseguire la funzione
  • captureStillImageAsynchronouslyFromConnection Se posso passare a un'altra applicazione, bloccare il telefono, prendere alcune altre azioni nell'applicazione, o toccare il pulsante "Scatta foto" un milione di volte sono in grado di ottenere il blocco di completamento per restituire un errore. Sono diversi in base a quale azione. Quelli comuni sono 11800, 11801 e 11830. Sembrano non essere collegati al blocco.
  • Ho lasciato che il nostro telefono di prova (iPhone 4 GSM) si sieda per un'ora per vedere se alla fine verrà elaborato. Niente da fare.

Mi piacerebbe sapere se c'è qualcosa che potrei mancare, una proprietà lasciata non impostata, o un problema noto con un lavoro in giro.

Grazie.

(Ho visto un post simile, ma nessuna delle risposte ha risolto il mio problema. Ho bisogno di Photo res nell'applicazione.Per riferimento: iPhone SDK 4 AVFoundation - How to use captureStillImageAsynchronouslyFromConnection correctly?)

risposta

6

avrei dovuto aggiungere il codice, probabilmente lo avrebbe aiutato a chiunque la visione di questo, ma in ogni caso:

Si scopre che la macchina fotografica Flash ha un significativo impatto sufficiente sulla quantità di tempo richiede di elaborare l'immagine per causare problemi quando si cattura qualcosa in modo asincrono. Avevo terminato accidentalmente la sessione di cattura prima che la notifica fosse inviata dal blocco completionHandler.

- (void) saveImageFromCamera { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageCapturedFromCamera) name:@"FTW_imageCaptured" object:nil]; 

    [cameraController captureStillImage]; 
    // WRONG: Session was stopped here before 
} 

- (void) imageCapturedFromCamera { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"FTW_imageCaptured" object:nil]; 

    [sharedAppController setBackgroundImage:[cameraController stillImage]]; 
    sharedAppController.imageFromCamera = YES; 
    [self endCamera]; 
    // CORRECT: Should have stopped session here 

    [self updateBackgroundImage]; 
} 

Spero che questo possa aiutare qualcun altro che si imbatte in qualcosa di simile.

Problemi correlati