2013-02-08 7 views
8

Ich habe seit über einer Woche mit diesem Problem gekämpft. Ich hoffe, dass jemand sieht, was ich falsch mache. Ich versuche, die finishWithingWithCompletionHandler: -Methode zu verwenden, da die finishWriting-Methode jetzt veraltet ist. Mit der neuen Methode hatte ich keinen Erfolg. Es schlägt mit einem unbekannten Fehler -11800 fehl. Ich kann meine MOV-Datei mit der veralteten Methode Fine speichern, aber wenn ich die Entsprechung mit der neuen Methode erstelle, versagt sie jedes Mal.AVAssetWriter finishWithingCompletionHandler Fehler mit unbekanntem Fehler

Hier ist meine Original-Code:

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]; 
     }); 
    } 
}]; 

Meine neue Methode ist wie folgt:

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]; 
      }); 
     } 
    }]; 
}]; 

Ich glaube nicht, dass ich etwas verpasst, und ich bin von dem Fehler nicht viel es immer wirft. Jede Hilfe wird sehr geschätzt.

Danke, Rob

Antwort

21

Ich fand schließlich die Antwort. Die finishWritingWithCompletionHandler: war fehlerhaft, weil ich die markAsFinished auf den AVAssetWriterInput Objekten nicht ausgeführt habe. Sobald ich die markAsFinished Methoden vor die finishWritingWithCompletionHandler: lief, konnte der Prozess ohne Fehler abgeschlossen werden.

+3

Ich markiere es als Finish und es stürzt immer noch ... – SpaceDog

11

Ich hatte ähnliches Problem und festgestellt, dass der Handler nicht aufgerufen wurde, weil ich die AVAssetWriter sofort nach dem Aufruf finishWritingWithCompletionHandler:, z.

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

self.assetWriter = nil; 

es zu beheben, verschieben Sie die Freigabeleitung innerhalb des Abschluss-Handler:

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

ah !!! brillant! thx – Bastek

+0

Als zusätzliches Element, wenn Sie ARC verwenden und Sie AssetWriter als lokale Variable anstelle einer Eigenschaft haben, können Sie es mit __block deklarieren. –

0

Die Antwort war für mich finishWritingWithCompletionHandler Aufruf zu entfernen. Anscheinend wurde die Funktion schon einmal aufgerufen.