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.