2011-10-30 7 views
2

iphone/ipod touch用のビデオ編集アプリケーションに取り組んでいます。私のアプリは、単にカメラのロールディレクトリの既存のビデオの1つを選択するようにユーザーに求め、フレームごとにピクセル値を変更し、カメラロールディレクトリに別の名前で再度保存します。ビデオ処理がかなり長くなる可能性があるため、以前に開始したセッションを再開するために何らかの機能を実装する必要があります(つまり、ビデオ処理がビデオ長の30%に達し、ユーザーがホームボタンを押したとき私のアプリケーションは、フォアグラウンドビデオ処理に戻って来て、最初からではなく30%から開始する必要があります)。私のコードのios:AVAssetビデオベースの書き込みセッションを再開する方法

最も重要な部分(読みやすくするためにビットを簡素化):

AVAssetReader* assetReader = [[AVAssetReader alloc] initWithAsset:sourceAsset error:&error]; 
NSArray* videoTracks = [sourceAsset tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0]; 
AVAssetReaderTrackOutput* assetReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack 
[assetReader addOutput:assetReaderOutput]); 
[assetReader addOutput:assetReaderOutput]; 
[mVideoWriter startWriting] 
[mAssetReader startReading] 
[mVideoWriter startSessionAtSourceTime: kCMTimeZero]; 
mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL); 
[writerInput requestMediaDataWhenReadyOnQueue:mediaInputQueue usingBlock:^{ 
    while (mWriterInput.readyForMoreMediaData) { 
     CMSampleBufferRef nextBuffer = [mAssetReaderOutput copyNextSampleBuffer]; 
     if (nextBuffer) { 
      // frame processing here 
     } // if 
    } // while 
}]; // block 
// when done saving my video to camera roll directory 

私はapplicationWillResignActive、applicationWillEnterForegroundのような私のアプリのデリゲートのコールバックメソッドに聞いているが、私が処理するかどうかはわかりませんそれらは適切な方法で。私はすでに試した:

映画の

は、1)[AVAssetWriter開始/ endSessionAtSourceTime]、残念ながら「手で」停止と保存私

2)のために動作しませんでした最後のフレームのプレゼンテーション時間に開始するすべての部分それは、処理され、処理がAVMutableCompositionを使用して、それらのすべてをマージ100%に達したときに、このソリューションは、しかし、時々...誰かが私にそれが正しく行われるべきか、いくつかのヒントを与えることができれば

は本当に素晴らしいことだディスパッチキューにクラッシュした

答えて

0

AVAssetWriterは追加できないにする必要がある場合は、2)の行に沿って何かを入力し、それらをマージして保存することがおそらく最適な解決策です。

しかし、まずそのクラッシュを解決する必要があります。

また、何百ものムービーを作成する前に、プレゼンテーションのタイムスタンプ/期間を慎重に管理すれば、AVAssetWriter.movieFragmentIntervalのように見えるはずです。

関連する問題