AVCaptureOutput didOutputSampleBuffer cesse d'être appelé

J'ai un problème avec la méthode déléguée didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection de AVCaptureOutput .

Il arrête d'être appelé dans une seconde ou deux lorsque j'ajoute le sampleBuffer à un CFArray . Si je supprime le code CFArray , la méthode delegate continue d'être appelée, donc je n'ai aucune idée de la raison pour laquelle le code CFArray arrête. J'apprécierais toute aide.

 @property CFMutableArrayRef sampleBufferArray; - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { NSLog(@"Called"); if (!self.sampleBufferArray) { self.sampleBufferArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); CFArrayAppendValue(self.sampleBufferArray, sampleBuffer); } else { CFArrayAppendValue(self.sampleBufferArray, sampleBuffer); } } 

Console ouput:

 // Session start 2015-06-15 13:06:07.264 App[22467:5897858] Called 2015-06-15 13:06:07.286 App[22467:5897858] Called 2015-06-15 13:06:07.289 App[22467:5897858] Called 2015-06-15 13:06:07.315 App[22467:5897895] Called 2015-06-15 13:06:07.366 App[22467:5897895] Called 2015-06-15 13:06:07.384 App[22467:5897895] Called 2015-06-15 13:06:07.411 App[22467:5897895] Called 2015-06-15 13:06:07.449 App[22467:5897858] Called 2015-06-15 13:06:07.480 App[22467:5897858] Called 2015-06-15 13:06:07.513 App[22467:5897895] Called 2015-06-15 13:06:07.546 App[22467:5897895] Called 2015-06-15 13:06:07.579 App[22467:5897895] Called 2015-06-15 13:06:07.614 App[22467:5897895] Called // No more calls after this point 

Votre problème est réellement référencé dans les documents , en particulier;

Si votre application provoque la suppression d'échantillons en conservant trop longtime les objects CMSampleBufferRef fournis, mais qu'elle a besoin d'accéder aux données de l'échantillon pendant une longue période, envisagez de copyr datatables dans un nouveau tampon et de libérer ensuite le tampon d'échantillon (si il était précédemment conservé) afin que la memory qu'il reference puisse être réutilisée.

Essentiellement, vous devez garder l'opération de callback aussi simple que possible, et si vous devez effectuer un traitement supplémentaire sur la trame qui vous est transmise dans le callback, vous devez le copyr dans un nouveau tampon et effectuer le traitement en arrière-plan. De plus, gardez à l'esprit que l'object Fondation de base doit explicitement être conservé et libéré.

Une autre considération est la pression de la memory. Les trames contiennent beaucoup de données, en conserver trop en provoquera le plantage de votre application.