捕获video文件的输出逐帧处理

我试图从video文件(7秒长)抓住个别帧,并遇到巨大的内存问题。

我用AVURLAsset加载一个资产,然后创build一个AVAssetReader和一个AVAssetReaderTrackOutput (像素格式为kCVPixelFormatType_32BGRA )。 一切似乎工作得很好,除了大量的内存命中,最终让我的应用程序几乎立即closures了操作系统。

只要我打电话给[myAVAssetReader startReading]内存就会激增25兆,而且只会越来越差。

即使我只是调用[myAVAssetReader startReading]然后[myAVAssetReader cancelReading][myAVAssetReader release] 25 megs永远不会被释放。 一旦我进入一个循环收集框架,它只会变得更糟:

 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正在使用的内存的任何线索?