3

こんにちは、AVAssetExportSession オブジェクトを作成してビデオ ファイルを保存および作成する iPhone アプリケーションを開発しています。保存プロセスを再開しようとする場合を除いて、すべて問題ありません (ファイルが作成され、ドキュメント フォルダーに正しく保存されます)。ホームボタンを押してアプリを終了すると (または電話や SMS を受信した場合)、メソッド exportAsynchronouslyWithCompletionHandler が失敗します。Apple のドキュメントには次のように書かれています。

「既存のファイルを上書きしようとしたり、アプリケーションのサンドボックス外にファイルを書き込もうとすると、エクスポートは失敗します。既存のファイルを上書きする必要がある場合は、最初にそれを削除する必要があります。エクスポートは次の場合にも失敗する可能性があります。

着信あり

アプリケーションがバックグラウンドにあり、別のアプリケーションが再生を開始します

このような状況では、通常、エクスポートが失敗したことをユーザーに通知してから、ユーザーがエクスポートを再開できるようにする必要があります。」

そのため、エクスポートをキャンセルしてから、ユーザーがアプリを再度開いたときに再起動しようとします。exportAsynchronouslyWithCompletionHandler が 2 回目に呼び出されると、次のエラーが発生します。

「キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'exportAsynchronouslyWithCompletionHandler を呼び出せません: 複数回。'"

[asset CancelExport] exportAsynchronouslyWithCompletionHandler が生きたままになっているようですが、可能でしょうか? また、2 回目の呼び出しでアセットを別のビュー コントローラーにエクスポートしようとしましたが、結果は同じです。アセットを失うことなく、中断後に保存を繰り返すにはどうすればよいですか (それは別のビュー コントローラーによってビルドされており、新しいユーザーの操作なしでは再構築できません)。

これは私のコードです:

-(無効)保存{

[asset exportAsynchronouslyWithCompletionHandler:^
 {
     switch (asset.status) 
     {
         case AVAssetExportSessionStatusCompleted: 
         {


             [self performSelectorOnMainThread:@selector(lanciosuccess) withObject:nil waitUntilDone:NO];

             break;
         }

         case AVAssetExportSessionStatusFailed:
         {

             [asset cancelExport];
             [self performSelectorOnMainThread:@selector(sospendi) withObject:nil waitUntilDone:NO];

             break;
         }
         case AVAssetExportSessionStatusUnknown: 
         {
              NSLog (@"unknow");



             break;
         }
         case AVAssetExportSessionStatusWaiting: 
         {
              NSLog (@"waiting");



             break;
         }
         case AVAssetExportSessionStatusCancelled: 
         {
              NSLog (@"cancelled");



             break;
         }


     };

 }];

}

-(void)sospendi{

if ([[NSFileManager defaultManager] fileExistsAtPath:[asset.outputURL path]]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:[asset.outputURL path] error:nil];
}

[self save];

}

4

0 に答える 0