2013-02-08 24 views
8

私はこの問題を1週間以上苦労しています。誰かが私が間違っていることを見て欲しいです。私は、finishWritingメソッドが廃止されたので、finishWritingWithCompletionHandler:メソッドを使用しようとしています。私は新しい方法を使っても何の成功もしていません。不明なエラー-11800で失敗します。推奨されないメソッドを使用してMOVファイルを保存することはできますが、新しいメソッドで同等のメソッドを作成すると、毎回失敗します。ここでAVAssetWriter finishWritingWithCompletionHandlerエラーが不明なエラー

は私の元のコードです:

dispatch_async(movieWritingQueue, ^{ 
    if ([self.assetWriter finishWriting]) { 
     self.assetWriterAudioIn = nil; 
     self.assetWriterVideoIn = nil; 
     //[assetWriter release]; ARC will not allow this line. 
     self.assetWriter = nil; 

     self.readyToRecordVideo = NO; 
     self.readyToRecordAudio = NO; 

     [self.delegate movieReadyToSaveForMovieProcessor:self]; 
    } 
    else { 
     [self displayError:[assetWriter error]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self resumeCaptureSession]; 
     }); 
    } 
}]; 

次のように私の新しい方法は次のとおりです。

dispatch_async(movieWritingQueue, ^{ 
    [self.assetWriter finishWritingWithCompletionHandler:^{ 
     if (self.assetWriter.status != AVAssetWriterStatusFailed && self.assetWriter.status == AVAssetWriterStatusCompleted) { 
      self.assetWriterAudioIn = nil; 
      self.assetWriterVideoIn = nil; 
      self.assetWriter = nil; 

      self.readyToRecordAudio = NO; 
      self.readyToRecordVideo = NO; 

      [self.delegate movieReadyToSaveForMovieProcessor:self]; 
     } else { 
      [self displayError:self.assetWriter.error]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self resumeCaptureSession]; 
      }); 
     } 
    }]; 
}]; 

私は私が何かを逃したし、私はエラー、そこからあまり届かないとは思いませんスロー。どんな助けでも大歓迎です。

おかげで、 ロブ

答えて

21

は、私は最終的に答えを見つけました。私がAVAssetWriterInputオブジェクトでmarkAsFinishedを実行しなかったため、finishWritingWithCompletionHandler:が失敗しました。いったんmarkAsFinishedメソッドの前にfinishWritingWithCompletionHandler:を実行すると、プロセスはエラーなく完了することができました。

+3

私はフィニッシュとしてマークしていますが、まだクラッシュしています... – SpaceDog

11

同様の問題があり、finishWritingWithCompletionHandler:を呼び出した直後にAVAssetWriterをリリースしたため、ハンドラが呼び出されなかったことが判明しました。それを修正する

[self.assetWriter finishWritingWithCompletionHandler:^{ 
    ... 
}] 

self.assetWriter = nil; 

、ちょうど完了ハンドラ内に解放する線を移動:私はfinishWritingWithCompletionHandlerを呼び出す削除するため

[self.assetWriter finishWritingWithCompletionHandler:^{ 
    ... 
    self.assetWriter = nil; 
}] 
+0

ああ!ブリリアント! thx – Bastek

+0

ARCを使用していて、プロパティの代わりにローカル変数としてassetWriterを使用している場合、__blockを使用してそれを宣言できます。 –

0

答えでした。どうやら、その関数はすでに一度呼び出されていました。