2017-01-26 2 views
1

Obtenir cette erreur lorsque le fichier exportationObtention de l'erreur lors de l'ajout de filigrane sur la vidéo dans l'objectif ios c

erreur Domaine = AVFoundationErrorDomain Code = -11800 « L'opération n'a pas pu être terminée » UserInfo = {NSUnderlyingError = 0x608000642310 {Erreur de domaine = code NSOSStatusErrorDomain = -12120 "(null)"}

AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:url options:nil]; 

AVMutableComposition* miComposition = [AVMutableComposition composition]; 

AVMutableCompositionTrack *compositionVideoTrack = [miComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVAssetTrack *clipVideoTrack = [videoAsset tracksWithMediaType:AVMediaTypeVideo].firstObject; 
AVMutableCompositionTrack *compositionAudioTrack = [miComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVAssetTrack *clipAudioTrack = [videoAsset tracksWithMediaType:AVMediaTypeAudio].firstObject; 
//If you need audio as well add the Asset Track for audio here 

[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [videoAsset duration]) ofTrack:clipVideoTrack atTime:kCMTimeZero error:nil]; 
[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [videoAsset duration]) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil]; 

[compositionVideoTrack setPreferredTransform:[[videoAsset tracksWithMediaType:AVMediaTypeVideo].firstObject preferredTransform]]; 



CGSize sizeOfVideo=[clipVideoTrack naturalSize]; 



//Image of watermark 
UIImage *myImage=[UIImage imageNamed:@"_minutestory.png"]; 
CALayer *layerCa = [CALayer layer]; 
layerCa.contents = (id)myImage.CGImage; 
layerCa.frame = CGRectMake((sizeOfVideo.width - 100),20 , 100, 100); 
layerCa.opacity = 0.6; 

CALayer *optionalLayer=[CALayer layer]; 

optionalLayer.frame=CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height); 
[optionalLayer setMasksToBounds:YES]; 

CALayer *parentLayer=[CALayer layer]; 
CALayer *videoLayer=[CALayer layer]; 
parentLayer.frame=CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height); 
videoLayer.frame=CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height); 
[parentLayer addSublayer:videoLayer]; 
[parentLayer addSublayer:optionalLayer]; 
[parentLayer addSublayer:layerCa]; 

AVMutableVideoComposition *videoComposition=[AVMutableVideoComposition videoComposition] ; 
videoComposition.frameDuration=CMTimeMake(1, 30); 
videoComposition.renderSize=sizeOfVideo; 
videoComposition.animationTool=[AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [miComposition duration]); 
AVAssetTrack *vidTrack = [[miComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:vidTrack]; 
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
videoComposition.instructions = [NSArray arrayWithObject: instruction]; 

[[NSFileManager defaultManager] removeItemAtPath:url error:NULL]; 

exporter2 = 
[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
exporter2.videoComposition = videoComposition; 

exporter2.outputURL=url; 
exporter2.outputFileType = AVFileTypeMPEG4; 
exporter2.shouldOptimizeForNetworkUse = YES; 




exportProgressBarTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(updateExportDisplay) userInfo:nil repeats:YES]; 

[exporter2 exportAsynchronouslyWithCompletionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self exportFinish:exporter2]; 


    }); 
}]; 
+0

Bienvenue dans Stack Overflow! Pour vous donner une bonne réponse, cela pourrait nous aider si vous jetez un coup d'œil sur [demander] si vous ne l'avez pas déjà fait. Cela pourrait aussi être utile si vous pouviez fournir un [mcve]. – Mat

+0

Cette erreur n'est pas vraiment très descriptive, mais ce que cela signifie, c'est que vous donnez à la composition une instruction qu'elle ne sait pas comment compléter. Essayez de réduire l'endroit où l'erreur se produit en commentant les différentes parties du code jusqu'à ce que vous obteniez une vidéo de travail, puis en les rajoutant. Il y aura quelque chose que vous faites qui n'a pas de sens, typiquement dans les instructions de calque - Vous aurez un cadre incorrect, un mauvais départ, des instructions qui se chevauchent, quelque chose comme ça. –

Répondre

0

d'abord, vous devriez peut-être utilisé une autre URL comme outputURL pour votre exportateur, le code ci-dessus utiliser l'URL source de AVURLAsset comme outputURL de l'exportateur, et sur la base que vous ne supprimez file at url before export (ce qui signifie que vous supprimez l'asset source utilisé exporté), vous ne pouvez pas atteindre votre objectif. Par ailleurs, si vous souhaitez supprimer le fichier en fonction de l'URL. Vous devez utiliser

[[NSFileManager defaultManager] removeItemAtURL:url error:nil]; 

à la place.