2017-01-26 4 views
1

Получение этой ошибки при экспорте файлаПолучение Ошибка при добавлении водяного знака на видео в цель Ios с

Ошибка домена = AVFoundationErrorDomain Code = -11800 «Операция не может быть завершена» UserInfo = {NSUnderlyingError = 0x608000642310 {Ошибка домена = NSOSStatusErrorDomain Code = -12120 «(нуль)»}

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

Добро пожаловать в переполнение стека! Чтобы дать вам отличный ответ, это может помочь нам, если у вас есть взгляд на [спросить], если вы еще этого не сделали. Это может быть полезно, если вы можете предоставить [mcve]. – Mat

+0

Эта ошибка на самом деле не очень описательная, однако это означает, что вы даете композиции инструкцию, которая не знает, как ее завершить. Попробуйте сузить место, где произошла ошибка, комментируя различные части кода, пока вы не получите рабочее видео, а затем добавьте их обратно. Будет что-то, что вы делаете, что не делает «смысл», как правило, в инструкциях слоя - у вас будет неправильный фрейм, плохое время начала, перекрывающиеся инструкции, что-то в этом роде. –

ответ

0

Во-первых, может быть, вы должны использоваться другой URL, как outputURL для экспортера, код выше исходного URL использовать AVURLAsset в качестве outputURL экспортера, и на основе вы удалить файл в url перед экспортом (это означает, что вы удаляете исходный актив, использованный для экспорта), вы не можете достичь своей цели.
Кстати, если вы хотите удалить файл на основе url. Вы должны использовать

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

вместо этого.

Смежные вопросы