2013-12-12 94 views
1

寫大量的圖像,視頻文件,當我創建通過使用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 {}來包裝這部分。它有效地阻止了峯值內存使用率的累積,但即使沒有運行錯誤,它也不能成功寫入視頻文件。

以上的說明是從真實設備調試。

我想到了可能的解決方案是分段書寫,或書寫週期中暫停了幾次,以便緩衝真正由作家釋放。但我沒有找到辦法做到這一點。我很欣賞任何知道解決這個峯值記憶問題的方法的人。

+0

我使用目前的解決方案是將寫入任務分離到不同的區段,每個區段中寫入的單個文件。在循環結束時,我使用AVMutableComposition來組合所有小文件。通過這種方法,峯值記憶出現在每個段中。由於每個段沒有太多的imgs可寫,所以內存不會被消耗太多。我欣賞其他想法 –

回答

0

我有同樣的問題與你

我嘗試使用sleepForTimeInterval內

  • (空)didReceiveMemoryWarning

我是希望,當這個事件觸發時,它會暫停主要工藝河畔給很少有時間 系統刷新未使用的內存

,但我不知道這是否有效Ø R值不要

+0

只是爲了讓你知道我使用前面提到的方式來解決它。您可以將導出視頻任務分割成許多短片視頻。然後最後將它們合併在一起。這對我來說很好。我的應用程序已經放在應用程序商店,你可以看看它看到這種方法生成長時間視頻。我的應用程序是「動畫DIY」 –