2013-02-08 25 views
8

Sono stato alle prese con questo problema per oltre una settimana. Spero che qualcuno veda cosa sto sbagliando. Sto tentando di utilizzare il metodo finishWritingCompletionHandler: poiché il metodo finishWriting è ora deprecato. Non ho avuto alcun successo con il nuovo metodo. Fallisce con un errore sconosciuto -11800. Posso salvare il mio file MOV usando il metodo deprecato, ma quando creo l'equivalente con il nuovo metodo fallisce ogni volta.AVAssetWriter finishWritingWithCompletionHandler errore con errore sconosciuto

Ecco il mio codice originale:

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

Il mio nuovo metodo è il seguente:

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

non credo che mi mancava nulla e non sto ottenendo molto dall'errore esso getta. Qualsiasi aiuto sarà molto apprezzato.

Grazie, Rob

risposta

21

ho finalmente trovato la risposta. Il finishWritingWithCompletionHandler: non funzionava perché non ho eseguito il markAsFinished sugli oggetti AVAssetWriterInput. Dopo aver eseguito i metodi markAsFinishedprima del il finishWritingWithCompletionHandler:, il processo è stato in grado di completare senza errori.

+3

Sto marcando come finitura ed è ancora in crash ... – SpaceDog

11

Ho riscontrato un problema simile e ho riscontrato che il gestore non è stato chiamato perché ho rilasciato lo AVAssetWriter subito dopo aver chiamato finishWritingWithCompletionHandler:, ad es.

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

self.assetWriter = nil; 

Per risolvere il problema, basta spostare la linea di rilascio verso l'interno del gestore di completamento:

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

ah !!! brillante! grazie – Bastek

+0

Come elemento aggiuntivo se stai usando ARC e hai assetWriter come variabile locale invece di una proprietà puoi dichiararlo con __block. –

0

La risposta è stata per me di rimuovere chiamando finishWritingWithCompletionHandler. Apparentemente la funzione era già stata chiamata una volta.