Edición de video AVMutableComposition

Estoy creando un video usando AVMutableComposition y exportándolo usando AVAssetExportSession lo que le AVAssetExportPresetHighestQuality preestablecido.

El video se crea bien cuando la dimensión del video es pequeña. Pero cuando la dimensión del video es grande, por ejemplo (1280 × 1920), el video no se crea correctamente. Se agrega una superposition verde al video como se muestra a continuación:

introduzca la descripción de la imagen aquí

Pero cuando uso AVAssetExportPresetPassthrough cambio AVAssetExportPresetHighestQuality , el video se crea bien.

¿Alguna idea de por qué sucede esto?

¡¡Gracias por adelantado!!

testing este código:

 -(void)convertVideo:(NSString *)videoPath{ AVURLAsset *firstAsset=[[AVURLAsset alloc]initWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"%@", videoPath]] options:nil]; AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init]; //VIDEO TRACK AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo prefernetworkingTrackID:kCMPersistentTrackID_Invalid]; [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration); CMTime audioTime = kCMTimeIndefinite; CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration); AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; if (OS_VERSION>=7) { if (firstAsset!=NULL) { AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio prefernetworkingTrackID:kCMPersistentTrackID_Invalid]; [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; } } else{ AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio prefernetworkingTrackID:kCMPersistentTrackID_Invalid]; [b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:audioTime error:nil]; } //FIXING ORIENTATION// AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack]; AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; UIImageOrientation FirstAssetOrientation_ = UIImageOrientationUp; BOOL isFirstAssetPortrait_ = NO; CGAffineTransform firstTransform = FirstAssetTrack.prefernetworkingTransform; if(firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0){ FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES; } if(firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0){ FirstAssetOrientation_ = UIImageOrientationLeft; isFirstAssetPortrait_ = YES; } if(firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0){ FirstAssetOrientation_ = UIImageOrientationUp; } if(firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0){ FirstAssetOrientation_ = UIImageOrientationDown; } [FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration]; CGFloat FirstAssetScaleToFitRatio = 0; MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,nil]; AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition]; MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction]; MainCompositionInst.frameDuration = CMTimeMake(1, 30); /*if(isFirstAssetPortrait_){ FirstAssetScaleToFitRatio = 0.67; CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.prefernetworkingTransform, FirstAssetScaleFactor) atTime:kCMTimeZero]; naturalSizeFirst = CGSizeMake(FirstAssetTrack.naturalSize.height, FirstAssetTrack.naturalSize.width); }else{ naturalSizeFirst = FirstAssetTrack.naturalSize; } */ CGSize naturalSizeFirst; if(isFirstAssetPortrait_){ FirstAssetScaleToFitRatio = FirstAssetTrack.naturalSize.width/FirstAssetTrack.naturalSize.height; CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.prefernetworkingTransform, FirstAssetScaleFactor) atTime:kCMTimeZero]; naturalSizeFirst = CGSizeMake(FirstAssetTrack.naturalSize.height, FirstAssetTrack.naturalSize.width); }else { naturalSizeFirst = FirstAssetTrack.naturalSize; } MainCompositionInst.renderSize = CGSizeMake(naturalSizeFirst.width, naturalSizeFirst.height); NSString *tmpDirectory = NSTemporaryDirectory(); NSString *fname = [NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]; NSString *tmpFile = [tmpDirectory stringByAppendingPathComponent:fname]; NSURL *url = [NSURL fileURLWithPath:tmpFile]; AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; exporter.outputURL=url; exporter.outputFileType = AVFileTypeQuickTimeMovie; exporter.videoComposition = MainCompositionInst; exporter.shouldOptimizeForNetworkUse = YES; [exporter exportAsynchronouslyWithCompletionHandler:^{ if (AVAssetExportSessionStatusCompleted == exporter.status) { [self.progressStatus setText:@"Converted..."]; selectedVideo = selectedVideo+1; } else if (AVAssetExportSessionStatusFailed == exporter.status) { // a failure may happen because of an event out of your control // for example, an interruption like a phone call comming in // make sure and handle this case appropriately //ALog(@"AVAssetExportSessionStatusFailed %@",exporter.error); } else { //ALog(@"Export Session Status: %d", exporter.status); } }]; } }