2013-02-04 11 views
7

Provo a creare un'app che cattura i fotogrammi dalla fotocamera dell'iPhone e che elabora con questi frame. Ho provato alcuni pezzi di codici trovati su Internet, ad es. qui: How to capture image without displaying preview in iOSPerché AVCaptureStillImageOutput :: captureStillImageAsynchronouslyFromConnection: completionHandler non viene mai chiamato?

e ho finito con il seguente pezzo di codice:

-(IBAction)captureNow{ 
    AVCaptureConnection *videoConnection = nil; 
    for (AVCaptureConnection *connection in stillImageOutput.connections) 
    { 
     for (AVCaptureInputPort *port in [connection inputPorts]) 
     { 
      if ([[port mediaType] isEqual:AVMediaTypeVideo]) 
      { 
       videoConnection = connection; 
       break; 
      } 
     } 
     if (videoConnection) { break; } 
    } 

    // NSLog(@"about to request a capture from: %@", stillImageOutput); 
    [stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) 
    { 
     CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL); 
     if (exifAttachments) 
     { 
      // Do something with the attachments. 
      NSLog(@"attachements: %@", exifAttachments); 
     } 
     else 
      NSLog(@"no attachments"); 

     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
     UIImage *image = [[UIImage alloc] initWithData:imageData]; 

     // do the processing with the image  
     } 

Tuttavia, l'applicazione non entra nel blocco di codice del gestore del metodo captureStillImageAsynchronouslyFromConnection quindi non ho mai ottenere l'immagine dalla cornice. Sto facendo qualcosa in modo sbagliato? Grazie per i vostri suggerimenti!

+2

È possibile verificare se il proprio 'AVCaptureSession' è ancora in esecuzione. Se lo interrompi in anticipo, il tuo completamentoHandler non viene mai chiamato. –

risposta

8

Ho scoperto che il puntatore a AVCaptureSession non viene mantenuto correttamente da AVCaptureStillImageOutput in modalità di conteggio automatico.

Questo significa che hai due opzioni:

2

È possibile controllare il parametro di errore NSError *. Ti dà informazioni sull'immagine scattata con successo. I codici di errore AVFoundation sono here. Spero che aiuti.

Inoltre si potrebbe voler leggere su this, dove spiega che il codice di sessione nello stesso posto potrebbe causare problemi.

Problemi correlati