我试图从视频文件中获取单个帧(7秒长)并遇到巨大的内存问题。
我正在使用AVURLAsset加载资产,然后创建AVAssetReader
和随附的AVAssetReaderTrackOutput
(带有像素格式kCVPixelFormatType_32BGRA
)。一切似乎工作得很好,除了大量的内存命中,最终几乎立即让我的应用程序关闭操作系统。
一旦我打电话给[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
正在使用的内存的任何线索?