4

我已經通過每個列表我能找到這個想法,但一直停留幾天的現在所以這裏的希望看着......問題創造大量使用AVAssetImageGenerator與ARC縮略圖

我想使用AVAssetImageGenerator一次創建大量視頻縮略圖(大約100個)。 雖然測試我總是使用相同的電影文件,但過程(看似)隨機成功或失敗,再加上我現在所有的電影加載到物理內存一次,我不想。我明顯做錯了什麼,但無法弄清楚 - 在ARC下無法手動管理內存。

背景; 這是一款使用ARC(Xcode 4.2.1,OSX 10.7.2,MBP 2.4GHz i5,4GB RAM)的AVFoundation視頻播放器。 它有一個播放列表樣式界面,允許您拖動影片文件的文件夾。它通過它給出的路徑遞歸併抽出有效的電影並將它們添加到列表中。 電影由具有AVAsset成員變量(movieAsset)的Movie類表示,該變量用文件路徑初始化。到目前爲止這麼好 - 一切正常,電影可以播放,只有正在播放的電影在物理記憶中。 我已將-createThumbnail方法添加到在Movie的init方法(以下代碼片段)中調用的Movie類。 隨着此代碼的添加,我收到了一些我無法根除的行爲 - 如果我不在下面調用-createThumbnail代碼,則不會發生這些行爲。任何想法,我要去錯了嗎?

  1. 每部電影添加到播放列表現在被立即加載到物理內存 - 這樣的應用程序的內存佔用量已經一路(不帶縮略圖碼= 40MB的100部電影,以縮略圖(在32x18像素NSImages)750MB爲同樣的100部電影)。

  2. 查看活動監視器 - >打開文件和端口,即使縮略圖創建完成後,也會列出所有電影文件。這並沒有發生 - 只有正在播放的電影才被列出。

  3. 創建縮略圖完全鎖定我的機器,直到它完成 - 即使我在異步塊內調用AVAssetImageGenerator - (CPU使用率永遠不會超過35%)。這可能是試圖一次讀取100部電影的磁盤訪問問題嗎?

  4. 創建縮略圖非常不穩定。有時候會創建所有縮略圖,但通常30-70%的數字通常不是。也許還有一個磁盤訪問問題?

我很新的面向對象和對象 - 所以可能已經做出了錯誤的新手 - 但我不能追查......

另外值得一提的是,「錯誤創建縮略圖」和‘錯誤查找時間’NSLogs從來不被稱爲...

-(void)createThumbnail{ 
     NSArray *keys = [NSArray arrayWithObject:@"duration"]; 
     [movieAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^() { 
      NSError *error = nil; 
      AVKeyValueStatus valueStatus = [movieAsset statusOfValueForKey:@"duration" error:&error]; 
      switch (valueStatus) { 
       case AVKeyValueStatusLoaded: 
        if ([movieAsset tracksWithMediaCharacteristic:AVMediaTypeVideo]) { 
        AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:movieAsset]; 
         Float64 movieDuration = CMTimeGetSeconds([movieAsset duration]); 
         CMTime middleFrame = CMTimeMakeWithSeconds(movieDuration/2.0, 600); 

         CGImageRef imageForThumbnail = [imageGenerator copyCGImageAtTime:middleFrame actualTime:NULL error:NULL]; 

         if (imageForThumbnail != NULL) {        
          NSSize sizeOption = NSMakeSize(32, 18); 
          self.thumbnail = [[NSImage alloc] initWithCGImage:imageForThumbnail size:sizeOption]; 
          NSLog(@"Thumbnail created for %@", [self filenameString]); 
         } 
         else{ 
          NSLog(@"-----Error creating thumbnail for %@", [self filenameString]); 
         } 
         CGImageRelease(imageForThumbnail); 
        } 
        break; 
       case AVKeyValueStatusFailed: 
        NSLog(@"Error finding duration"); 
        break; 
       case AVKeyValueStatusCancelled: 
        NSLog(@"Cancelled finding duration"); 
        break; 
      } 
     }]; 
    } 

(注:我一直在使用的電影文件相同的幾個文件夾開發的最後一個月左右應用他們。」重新設置在應用程序中成功播放的所有本地有效文件。這些文件夾中的某些文件夾包含超過一百個電影文件在各種子文件夾中)。

非常感謝任何人都可以幫忙。 Chas。

+0

你解決了嗎? – venky 2014-03-10 12:53:31

+0

我不確定在這裏,但我正在做類似的事情,而不是「持續時間」,我正在看「狀態」。我從其他地方得到了一些代碼,它不使用loadValuesAsync ...,而是使用KVO觀察方法觀察AVPlayerItem實例的「status」keyPath(將會有很多實例,因爲我對集合視圖中的每個單元都有一個實例) - 但問題幾乎相同,我只是猜測觀看狀態或持續時間可能會有所作爲。我沒有看到很多錯誤,但是我看到鎖定,可能導致我沒有使用後臺加載。 – Jonny 2015-11-11 23:11:54

回答

0

當我以這種方式使用AVAssetImageGenerator(至少在iOS上)時,我遇到了一些奇怪的問題。在我看來,至少在與blocks/GCD API結合使用時會有所損壞。不要以異步方式加載所有內容,請嘗試製作一個在單個後臺線程中運行的單個隊列/循環,然後以這種方式瀏覽電影。這也應該有助於減少內存使用量。