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クラスで表されます。これまでのところ、すべてが機能し、映画が再生され、再生されている映画だけが物理的な記憶にあります。 私はムービーのinitメソッド(以下のコードスニペット)で呼び出されるMovieクラスに-createThumbnailメソッドを追加しました。 このコードを追加することで、私が根絶することのできないいくつかの振る舞いを得ています。下の-createThumbnailコードを呼び出さないと、どちらも発生しません。私が間違っているアイデアは?

  1. すべての映画は、プレイリストに追加今すぐに物理メモリにロードされている - サムネイルで、100本の映画のために=サムネイルコードなし(40メガバイトをそのアプリのメモリフットプリントが途中まで行ってきました(32x18ピクセルでNSImages)750メガバイト同じ100の映画のために)。

  2. アクティビティモニタ - >ファイルとポートを開くと、サムネイルの作成が完了しても、すべてのムービーファイルが一覧表示されます。これは以前には起こりませんでした。再生されている映画だけがリストされていました。

  3. サムネイルを作成すると、非同期ブロック内でAVAssetImageGeneratorを呼び出していても、マシンが完全にロックされます(CPU使用率は35%を超えることはありません)。これは一度に100の映画を読み込もうとするディスクアクセスの問題でしょうか?

  4. サムネイルの作成は非常に不安定です。場合によってはすべてのサムネイルが作成されることもありますが、30〜70%のランダムなものは作成されないことがあります。多分ディスクアクセスの問題でしょうか?

私はおそらく初心者ミスを犯してきたOOPとOBJの-Cに非常に新しいです - また、「エラーが作成していることは注目に値するが、私はちょうどそれを追跡することはできません...

私は先月かそこらのためのアプリケーションを開発するために、ムービーファイルの同じ数のフォルダを使用してきた彼らは「:。サムネイル」と 『エラー発見期間』 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; 
      } 
     }]; 
    } 

と呼ばれることはありませんアプリケーションで正常に再生されるすべてのローカル有効なファイルを再作成します。これらのフォルダの一部には、100以上のムービーファイルが含まれていますさまざまなサブフォルダ内にあります)。

誰かが助けてくれれば幸いです。 Chas。

+0

あなたはこれを解決しましたか? – venky

+0

私はここにはわかりませんが、私は似たようなことをやっていますし、 "期間"の代わりに "状態"を見ています。私は他の場所からいくつかのコードを取得していますが、loadValuesAsyncを使用していません...代わりにKVOの観測メソッドを使用してAVPlayerItemインスタンスの "ステータス" keyPathを観察します(コレクションビューの各セルに1つのインスタンスがあります)しかし、問題はほぼ同じで、状況や期間を見れば違いが生じるかもしれないと推測しています。私は多くのエラーを見ていないが、私はロックアップを見ている、私はまだ背景の読み込みを使用していない原因です。 – Jonny

答えて

0

このようにしてAVAssetImageGeneratorを使用すると、私はいくつかの奇妙な問題が発生しました(少なくともiOS上)。ブロック/ GCD APIと組み合わせて使用​​すると、やや壊れているようです。非同期にすべてをロードするのではなく、1つのバックグラウンドスレッドで動作する単一のキュー/ループを作成して、ムービーをそのように処理してみてください。これは、メモリ使用量を抑えるのにも役立ちます。

関連する問題