Я пытаюсь извлечь отдельные кадры из видеофайла (длиной 7 секунд) и сталкиваюсь с огромными проблемами с памятью.
Я загружаю ресурс с AVURLAsset, затем создаю AVAssetReader
и сопровождающий AVAssetReaderTrackOutput
(с пиксельным форматом kCVPixelFormatType_32BGRA
). Кажется, что все работает отлично, за исключением огромного количества памяти, которое приводит к тому, что ОС практически мгновенно отключает мое приложение.
Как только я позвоню [myAVAssetReader startReading]
, память наберет 25 мегабайт, и от этого будет только хуже.
Даже если я просто позвоню [myAVAssetReader startReading]
, тогда [myAVAssetReader cancelReading]
и [myAVAssetReader release]
25 мегабайт никогда не будут выпущены. Становится только хуже, когда я вхожу в цикл сбора кадров:
CMSampleBufferRef sample = [output copyNextSampleBuffer];
while( sample != NULL )
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer( sample );
// Lock the image buffer
CVPixelBufferLockBaseAddress( imageBuffer, 0 );
// Do stuff with the imageBuffer
// We unlock the image buffer
CVPixelBufferUnlockBaseAddress( imageBuffer, 0 );
// done with the sample
CFRelease( sample );
sample = [output copyNextSampleBuffer];
}
Есть какие-нибудь подсказки, как освободить память, используемую AVAssetReader
?