2015-06-15 6 views
5

Ho un problema con il metodo delegato didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection di AVCaptureOutput.AVCaptureOutput didOutputSampleBuffer smette di essere chiamato

Si interrompe la chiamata entro un secondo o due quando aggiungo sampleBuffer a CFArray. Se rimuovo il codice CFArray, il metodo delegate continua a essere chiamato così non ho idea del motivo per cui il codice CFArray sta causando l'arresto. Apprezzerei qualsiasi aiuto.

@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 
+1

come si crea e si avvia una sessione? come configuro il tuo output? hai provato a impostare un osservatore per la notifica di 'AVCaptureSessionRuntimeErrorNotification', si verifica? Se scrivi sul file, 'captureOutput: willFinishRecordingToOutputFileAtURL: fromConnections: dueToError:' si verifica? puoi fornire qualche progetto di esempio che riproduca il problema? Fornisci ulteriori informazioni sul tuo problema. –

risposta

11

Il tuo problema è in realtà riferimento nel Docs, particolare;

If your application is causing samples to be dropped by retaining the provided CMSampleBufferRef objects for too long, but it needs access to the sample data for a long period of time, consider copying the data into a new buffer and then releasing the sample buffer (if it was previously retained) so that the memory it references can be reused.

In sostanza, è necessario mantenere il funzionamento callback più semplice possibile, e dovrebbe essere necessario eseguire ulteriori elaborazioni sul telaio passato a lei nella callback, è necessario copiare in un nuovo buffer ed eseguire l'elaborazione in background. Inoltre, tieni presente che l'oggetto Core Foundation deve essere esplicitamente mantenuto e rilasciato.

Un'ulteriore considerazione è la pressione della memoria. I frame contengono molti dati, il mantenimento troppi causerà l'arresto anomalo dell'app.

+0

Wow, mi hai appena salvato da un mal di testa durato per un mese, grazie! – Charlie

+0

@ MDB983 potresti fornire qualche esempio di codice o tutorial? Sto lottando con questo problema molto tempo e non riesco a gestire sampleBuffer correttamente, ho l'arresto del SampleBufferDelegate dopo aver apportato alcune manipolazioni con sampleBuffer. –

+0

Come lo copi? –

Problemi correlati