2012-03-30 19 views
7

Estoy intentando fusionar (agregar) 3 videos usando AVAssetExportSession, pero sigo recibiendo este error. Curiosamente para 1 o 2 videos funcionó.iOS 5: Error al combinar 3 videos con AVAssetExportSession

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

Incluso he intentado volver a hacer la función en caso de error, pero lo que tengo es único mensaje de error infinito. Este es el fragmento de mi código.

AVMutableComposition *mixComposition = [AVMutableComposition composition]; 
AVMutableCompositionTrack *compositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
NSError * error = nil; 
NSMutableArray * timeRanges = [NSMutableArray arrayWithCapacity:arrayMovieUrl.count]; 
NSMutableArray * tracks = [NSMutableArray arrayWithCapacity:arrayMovieUrl.count]; 

for (int i=0; i<[arrayMovieUrl count]; i++) { 
    AVURLAsset *assetClip = [arrayMovieUrl objectAtIndex:i]; 
    AVAssetTrack *clipVideoTrackB = [[assetClip tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

    [timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, assetClip.duration)]]; 
    [tracks addObject:clipVideoTrackB]; 
} 
[compositionTrack insertTimeRanges:timeRanges ofTracks:tracks atTime:kCMTimeZero error:&error]; 

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset1280x720]; 
NSParameterAssert(exporter != nil); 
exporter.outputFileType = AVFileTypeQuickTimeMovie; 
exporter.outputURL = outputUrl; 
[exporter exportAsynchronouslyWithCompletionHandler:^{ 
    switch ([exporter status]) { 
     case AVAssetExportSessionStatusFailed: 
      NSLog(@"Export failed: %@", [exporter error]); 
      break; 
     case AVAssetExportSessionStatusCancelled: 
      NSLog(@"Export canceled"); 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      NSLog(@"Export successfully"); 
      break; 
     default: 
      break; 
    } 
    if (exporter.status != AVAssetExportSessionStatusCompleted){ 
     NSLog(@"Retry export"); 
     [self renderMovie]; 
    } 
}]; 

¿Hay algún problema con mi código o iOS 5 tiene alguna falla?

Respuesta

5

He encontrado el problema. Así que el problema fue en realidad porque uso AVPlayerLayer para mostrar cada video en modo de vista previa simultáneamente. En referencia a esta pregunta AVPlayerItem fails with AVStatusFailed and error code "Cannot Decode", hay un límite no documentado de un máximo de 4 AVPlayer simultáneos para trabajar. Y este límite de alguna manera impide que AVAssetExportSession funcione cuando hay 4 instancias de AVPlayer en ese momento.

La solución es lanzar AVPlayer antes de exportar, o no usar AVPlayer en conjunto.

+0

también puede inicializar el exportador utilizando una copia de la composición mutable en su lugar – Edwin

+0

¿Cómo liberar el AVPlayer en el objetivo c Xcode 8.2.1? – sohil