Quindi sto riscontrando un problema con la conversione di audio. Durante la conversione ricevo un'enorme perdita di memoria e proviene da queste righe di codice.CMSampleBufferRef memory leak
dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);
[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue
usingBlock:^
{
while (assetWriterInput.readyForMoreMediaData)
{
CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];
if (nextBuffer)
{
[assetWriterInput appendSampleBuffer: nextBuffer];
nextBuffer = NULL;
}
else
{
// done!
[assetWriterInput markAsFinished];
[assetWriter finishWriting];
[assetReader cancelReading];
NSDictionary *outputFileAttributes = [[NSFileManager defaultManager]
attributesOfItemAtPath:exportPath
error:nil];
NSNumber *doneFileSize = [NSNumber numberWithLong:[outputFileAttributes fileSize]];
[self performSelectorOnMainThread:@selector(updateCompletedSizeLabel:)
withObject:doneFileSize
waitUntilDone:NO];
// release a lot of stuff
[assetReader release];
[assetReaderOutput release];
[assetWriter release];
[assetWriterInput release];
[exportPath release];
break;
}
}
}];
La linea che sembra causare le perdite è: CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];
Sono perso su questo uno qualsiasi aiuto sarebbe molto apprezzato.
RISPOSTA: Risolto - Basta aggiungere queste righe alla fine dell'istruzione if/else.
CMSampleBufferInvalidate(nextBuffer);
CFRelease(nextBuffer);
nextBuffer = nil; // NULL?
Perché si chiama 'CMSampleBufferInvalidate' prima di' CFRelease'? – Meekohi
@Meekohi potrebbe non esserci un bisogno per questo ordine esatto, lo ha fatto lungo tempo fa e non sono sicuro, so che la combo ha fatto il lavoro però. – Krzemienski
Chiamare CFRelease sul buffer di esempio causa un arresto anomalo anche quando viene utilizzato senza CMSampleBufferInvalidate e sampleBuffer = NULL. Consiglio di usare solo CMSampleBufferInvalidate (nextBuffer); nextBuffer = NULL; – Zigglzworth