2012-09-10 21 views
5

In iOS, io sto usando codice per acquisire da AVCaptureStillImageOutput così:Perché jpegStillImageNSDataRepresentation genera un'eccezione quando il buffer di esempio NON è null?

[_captureStillOutput captureStillImageAsynchronouslyFromConnection: _captureConnection completionHandler: asyncCaptureCompletionHandler];

per semplicità ridursi il mio codice, il mio blocco asyncCaptureCompletionHandler assomiglia a questo:

void(^asyncCaptureCompletionHandler)(CMSampleBufferRef imageDataSampleBuffer, NSError *error) = 
^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 
    if (CMSampleBufferIsValid(imageDataSampleBuffer)) { 
     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
     UIImage *image = [[UIImage alloc] initWithData:imageData];                 
    } 
} 

Sono stato con tutto il mio codice e attraversare riferimento con overflow dello stack, e non ho trovato alcun suggerimento perché un campione valido il buffer sarebbe catturato senza essere un JPEG corretto.

_captureStillOutput = [[AVCaptureStillImageOutput alloc] init]; 
_captureStillOutput.outputSettings = 
     [NSDictionary dictionaryWithObjectsAndKeys: 
     AVVideoCodecJPEG, AVVideoCodecKey, 
     nil]; 

if ([session canAddOutput:_captureStillOutput]) { 
      [session addOutput:_captureStillOutput]; 
} 

C'è informazioni supplementare nel debugger: * Chiusura di applicazione a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: '* + [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:] - Non un tampone campione jpeg.'

Le ricerche in google e stack overflow per "Non un buffer di esempio jpeg" hanno prodotto risultati zero. Sono bloccato. Bah.

risposta

0

Il passo successivo per questa soluzione è stato quello di registrare tutti i dati riportati nel debugger utilizzando:

po imageDataSampleBuffer 

questo sempre prodotto un sacco di dettagli, mentre l'eccezione è stata gettata, un sacco di informazioni sul tampone campione . Quindi da quando ho postato questo messaggio in SO, ho commentato un po 'di codice, poi lo ho decompresso e ora funziona. Nulla è cambiato nel mio codice, tuttavia, ho chiuso alcuni programmi in esecuzione su mac. Forse era un bug della macchina di sviluppo. Dopo questo, ho chiuso e riaperto Xcode, e l'eccezione non è stata lanciata.

+0

Può confermare, un buon ol '' rm -rf DerivedData/* 'e il riavvio di Xcode ha risolto il problema per me. – Austin

+1

In realtà, il problema è riapparso, ma poi è andato via quando ho chiuso iTunes. Questo è piuttosto pazzesco – Austin

+0

Grazie per la nota che è riapparso e poi di nuovo scomparso. –

1

Questa domanda è vecchia ma d'oro. Vengo dal futuro e posso confermare che ciò accade ancora nel 2015. Ho provato a seguire gli stessi passaggi per risolvere il problema, ma senza risultato. Tuttavia, questa domanda mi ha fatto capire che lo CMSampleBufferRef imageDataSampleBuffer si comporta in modo strano quando viene trattato al di fuori del gestore di completamento di captureStillImageAsynchronouslyFromConnection.

In poche parole:

[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:connection 
                 completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    { 
     //call another method to handle the sample buffer causes weird behaviour 
     //maybe the buffer is not being safely referenced by AVFoundation? 
     [self handleBufferSomewhereElse:imageDataSampleBuffer]; //will behave strangely 
     //even more so if you move to another thread 
    }]; 

Preferisco fare questo invece:

[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:connection 
                 completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    { 
     //handle the buffer right here 
     NSData *data = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
     //works better 
    }]; 

Spero che questo aiuti qualcuno.