寫大量的圖像,視頻文件,當我創建通過使用AvAssetWriter組裝圖像轉換成視頻文件的功能。有關此實現的論壇中有幾個線程。我已經使用AVAssetWriter成功編寫了視頻。我的問題不是這個實現,而是關於內存消耗。就我而言,當我寫入4秒30FPS視頻1024 * 768時,峯值內存使用量將在300MB左右。對於更長的時間,10秒等,它會與內存警告崩潰。問題在於,在將每個圖像寫入視頻文件的循環過程中會累積內存使用量。循環之後,內存使用率將回落至正常水平而不會泄漏。高峯內存使用情況使用AVAssetWriter
以下代碼是循環的一個迭代。它附加一個新的形象給avassetwriter
CVPixelBufferRef buffer = [self pixelBufferFromCGImage:[newimg CGImage]
size:CGSizeMake(self.frameOrigWidth, self.frameOrigHeight) poolRef:adaptor.pixelBufferPool];
BOOL append_ok = NO;
int j = 0;
CMTime frameTime = CMTimeMake(frameCount,(int32_t)FPS);
while (!append_ok && j < 30) //attemp maximum 30 times
{
if (adaptor.assetWriterInput.readyForMoreMediaData)
{
if(frameCount==0) append_ok = [adaptor appendPixelBuffer:buffer
withPresentationTime:kCMTimeZero];
else append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
[NSThread sleepForTimeInterval:0.05];//use sleep instead of runloop because it is not in main thread
}else{
[NSThread sleepForTimeInterval:0.1];
}
j++;
}
if(buffer) CVBufferRelease(buffer);
甚至還有在最後一行緩衝版本,內存不會在整個循環過程中得到釋放,我想這是因爲作者保留這個緩衝區,直到循環後並且作家執行完成寫作。
我試着用@autoreleasepool {}來包裝這部分。它有效地阻止了峯值內存使用率的累積,但即使沒有運行錯誤,它也不能成功寫入視頻文件。
以上的說明是從真實設備調試。
我想到了可能的解決方案是分段書寫,或書寫週期中暫停了幾次,以便緩衝真正由作家釋放。但我沒有找到辦法做到這一點。我很欣賞任何知道解決這個峯值記憶問題的方法的人。
我使用目前的解決方案是將寫入任務分離到不同的區段,每個區段中寫入的單個文件。在循環結束時,我使用AVMutableComposition來組合所有小文件。通過這種方法,峯值記憶出現在每個段中。由於每個段沒有太多的imgs可寫,所以內存不會被消耗太多。我欣賞其他想法 –