2011-04-11 12 views
10

Estoy escribiendo una aplicación que funciona con video utilizando AVFoundation.AVAssetExportSession Error -11820

El comportamiento de mi aplicación es simple: tomo un video del rollo de la cámara, luego creo una composición de AVMutable con algunas pistas de audio. Con la composición de mezcla inicializo una AVAssetExportSession que almacena el archivo de video en el directorio de documentos de mi aplicación.

Hasta este momento todo está bien: mi video está almacenado y puedo reproducirlo en otro controlador. Si tomo el video que acabo de almacenar en mi carpeta de documentos para hacer algunas ediciones (de la misma manera que la primera vez que se creó la composición de AVmutable, AVAssetExportSession) está bien de nuevo.

Pero la tercera vez que hago este proceso para la edición de un vídeo se convierte en el estado AVAssetExportSession "Fail" y con este error:

"Domain=AVFoundationErrorDomain Code=-11820 "Cannot Complete Export" UserInfo=0x1a9260 {NSLocalizedRecoverySuggestion=Try exporting again., NSLocalizedDescription=Cannot Complete Export}"

He leído que es un error general en la sesión no podría ser exportado. ¿Cuál es el sentido de esto? ¿Por qué solo la tercera vez que hice el proceso de edición? ¿Podría ser un error de administración de memoria? ¿Un insecto?. Este es el código de mi AVAssetExportSession:

_assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
_assetExport.shouldOptimizeForNetworkUse = YES; 

///data odierna 
NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"ddMMyyyyHHmmss"]; 

NSDate *now = [[NSDate alloc] init]; 

NSString *dateString = [format stringFromDate:now]; 
[now release]; 
[format release]; 
NSString* ext = @".MOV"; 
NSString* videoName=[NSString stringWithFormat:@"%@%@", dateString, ext]; 

///data odierna 
NSString *exportPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:videoName]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
{ 
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil]; 
} 


_assetExport.outputFileType = AVFileTypeQuickTimeMovie; 

[_assetExport setTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)]; 
NSURL *exportUrl = [NSURL fileURLWithPath:exportPath] ; 

_assetExport.outputURL = exportUrl ; 

[_assetExport exportAsynchronouslyWithCompletionHandler:^ 
{ 
    switch (_assetExport.status) 
    { 
     case AVAssetExportSessionStatusFailed: 
     { 
      NSLog (@"FAIL %@",_assetExport.error); 
      if ([[NSFileManager defaultManager] fileExistsAtPath:[_assetExport.outputURL path]]) 
      { 
       [[NSFileManager defaultManager] removeItemAtPath:[_assetExport.outputURL path] error:nil]; 
      } 

      [self performSelectorOnMainThread:@selector (ritenta) 
            withObject:nil 
           waitUntilDone:NO]; 
      break; 
     } 
     case AVAssetExportSessionStatusCompleted: 
     { 
      NSLog (@"SUCCESS"); 

      [self performSelectorOnMainThread:@selector (saveVideoToAlbum:) 
            withObject:exportPath 
           waitUntilDone:NO]; 
      break; 
     } 
     case AVAssetExportSessionStatusCancelled: 
     { 
      NSLog (@"CANCELED"); 

      break; 
     } 
    }; 
}]; 

he hecho muchas búsquedas en la web, algunas personas han tenido un problema en el outputURL de la sesión, pero me han tratado y parece todo muy bien en mi código. Para asignar un nombre único al archivo, utilizo un NSDate. Para fines de depuración, he tratado de restaurar un nombre de cadena estándar, pero el problema persiste. ¿Algunas ideas? ¿Puede alguien sugerirme un método alternativo para exportar a la carpeta de documentos un activo con AssetWriter inscrito en la AVassetExportSession?

+0

El exportador a menudo falla cuando no proporciona la composición AVMutable correcta, por lo que debe eliminar los objetos AVMutableComposition por tercera vez. – BhushanVU

Respuesta

-1

El problema es _assetExport.outputFileType ha establecido el tipo AVFileTypeQuickTimeMovie. Lo cual no es probable que sea compatible con el tipo.

Trate de averiguar qué tipos de archivos de salida son compatibles con _assetExport usando el siguiente código y use el adecuado.

NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes); 

O
acaba de cambiar el

_assetExport.outputFileType = AVFileTypeQuickTimeMovie; 

A

exporter.outputFileType = @"com.apple.m4a-audio"; 

También no se olvide de cambiar la extensión de

NSString* ext = @".MOV"; to @".m4a" 

Th debería funcionar Funcionó para mí

Cuestiones relacionadas