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