objective kits development developer apple app ios6 avfoundation grand-central-dispatch avassetwriter

ios6 - kits - AVAssetWriter finishWritingWithCompletionHandler error con error desconocido



xcode kits (3)

He estado luchando con este problema por más de una semana. Espero que alguien vea lo que estoy haciendo mal. Estoy intentando utilizar el método finishWritingWithCompletionHandler: dado que el método finishWriting ahora está en desuso. No he tenido éxito usando el nuevo método. Falla con un error desconocido -11800. Puedo guardar mi archivo MOV utilizando el método en desuso, pero cuando creo el equivalente con el nuevo método falla siempre.

Aquí está mi código original:

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

Mi nuevo método es el siguiente:

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

No creo que me haya perdido nada y no estoy obteniendo mucho del error que arroja. Cualquier ayuda será apreciada.

Gracias, Rob


Tuve un problema similar y descubrí que el controlador no se llamó porque AVAssetWriter el AVAssetWriter inmediatamente después de llamar a finishWritingWithCompletionHandler: por ej.

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

Para solucionarlo, simplemente mueva la línea de liberación al interior del controlador de finalización:

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


Finalmente encontré la respuesta. The finishWritingWithCompletionHandler: estaba fallando porque no markAsFinished en los objetos AVAssetWriterInput . Una vez que ejecuté los métodos markAsFinished antes de finishWritingWithCompletionHandler: el proceso pudo completarse sin errores.


La respuesta fue que finishWritingWithCompletionHandler llamada a finishWritingWithCompletionHandler . Aparentemente la función ya fue llamada una vez.