Захват вывода видеофайла для покадровой обработки - PullRequest
2 голосов
/ 18 февраля 2011

Я пытаюсь извлечь отдельные кадры из видеофайла (длиной 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...