2012-01-23 18 views
0

私はH264ビデオファイルを読み込む機能があります。私はそれを使って多くのビデオファイルを連続して読みたいと思っています。それはファイル(ランダムな時間)のために働くようであり、少数のファイルのために部分的に失敗し(いくつかのフレームを読み込み、すべてのフレームではない)、完全に失敗します(0フレームを読み込みます)。私は同じビデオファイルをループすることでこれをテストしたので、この不確実性は奇妙です。OSX LionでAVAssetReaderを使用してビデオファイルを連続して読み込むことができません

私が取得エラーメッセージは次のとおりです。

エラードメイン= AVFoundationErrorDomainコード= -11800「操作を完了できませんでした」のUserInfo = 0x105d07480 {NSLocalizedFailureReasonが不明なエラーが(-6662)が発生= NSLocalizedDescriptionは操作を= NSUnderlyingError = 0x100159350 "操作を完了できませんでした(OSStatusエラー-6662)。"}

私はARCとOSX Lionを使用しています。すべてのヘルプははるかに高く評価されています

void uncompressMovie(NSString *moviePath) { 
AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:moviePath]]; 

NSArray* video_tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *video_track = [video_tracks objectAtIndex:0]; 

// Decompress to ARGB with the asset reader 
NSDictionary *decompressionVideoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
              [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB], (id)kCVPixelBufferPixelFormatTypeKey, 
              [NSDictionary dictionary], (id)kCVPixelBufferIOSurfacePropertiesKey, 
              nil]; 
AVAssetReaderTrackOutput *asset_reader_output = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:video_track outputSettings:decompressionVideoSettings]; 

NSError *error = [[NSError alloc] init]; 
AVAssetReader *asset_reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; 

if ([asset_reader canAddOutput:asset_reader_output]) { 
    [asset_reader addOutput:asset_reader_output]; 

    if ([asset_reader startReading] == YES) { 
     int count = 0; 

     while ([asset_reader status]==AVAssetReaderStatusReading) { 
      sampleBuffer = [asset_reader_output copyNextSampleBuffer]; 
      if (sampleBuffer == NULL) { 
       if ([asset_reader status] == AVAssetReaderStatusFailed) 
        break; 
       else  
        continue; 
      } 
      count++; 

      // Will do some work here    

      CFRelease(sampleBuffer); 
     } 

     if (count == 0) { 
      NSLog(@"I am doomed %@", [asset_reader error]); 
      exit(1); 
     } 

     NSLog(@"Processed %d frames from %@", count, moviePath); 
    } else 
     NSLog(@"Couldn't start"); 
} 

if ([asset_reader status] != AVAssetReaderStatusCompleted) 
    [asset_reader cancelReading]; 
// unlink([moviePath UTF8String]); 
} 
+0

複数のビデオファイルを読むのに問題がありますが、説明とサンプルコードでは複数のファイルを扱うことができないとの質問があります。私が何かを見逃していない限り、あなたは質問の言語を改善する必要があるようです。 –

+0

私は、同じ時間に多くのファイルではなく、バックファイルを読み込むことを意味することを示しています。 –

答えて

0

copyNextSampleBufferを呼び出した後CMSampleBufferMakeDataReadyを()を追加しようとすると面白いかもしれません。これは通常、データを使用するときに呼び出されますが、後のブロックを適切に処理するためには、デコーダのいくつかが呼び出される必要があるのでしょうか。

また、このループをインストゥルメントでプロファイリングし、このループ中にメモリが増加しているかどうかを確認する必要があります。サンプルバッファでCFReleaseを正しく呼び出すようですが、ビルド中のAVAssetReaderOutputには大きな自動解放オブジェクトがいくつか存在する可能性があります。メモリが増えているように見える場合は、NSAutoreleasePoolをループの内側に置いて、これをクリーンアップしてみてください。

+0

CMSampleBufferMakeDataReady()は何の違いもありません。また、このループ中にメモリが増加することはありません。 OTOH、VTDecoderXPCServiceは一時的に巨大になり(仮想メモリ用に> 2 GB)、その後は消えてしまったようです。 –

+0

OK、https://developer.apple.com/library/mac/#samplecode/avexporter/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011051でavexportのサンプルを見て、あなたのコードには違いがあります。同じサンプルムービーを使って同じムービーを実行し、同じ問題があるかどうか確認することもできます。また、Mac開発者のサンプルコードページには他のAVFoundationサンプルもあります。 –

+0

その例は忘れて、代わりにhttps://developer.apple.com/library/mac/#samplecode/ReaderWriter/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011124でAVReaderWriterサンプルを試してみてください。 –

関連する問題