2014-02-10 7 views
5

Ich habe ein paar Beispiele gefunden, die zeigen, wie ein Text-Overlay in einem Video hinzugefügt wird.Hinzufügen eines Text-Overlays mit AVMutableVideoComposition zu einem bestimmten Zeitraum

Ray Tutorial - http://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos

Diese SO beantworten - How can I add a watermark in a captured video on iOS

Es gibt ein paar andere waren, die ich als gut bezeichnet. Mein Code sieht fast identisch mit dieser Antwort aus und ich habe versucht, ihn zu optimieren, damit das Text-Overlay am Anfang des Videos nur für ein oder zwei Sekunden angezeigt wird. Irgendeine Hilfe, wie ich das erreichen könnte?

Hier ist mein Code. Dies funktioniert so wie es ist, um das Video zu exportieren, wobei das Overlay für die gesamte Dauer angezeigt wird.

if(vA) { 
    videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [videoCompositionTrack insertTimeRange:videoTimerange ofTrack:[[vA tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:&error]; 
    [videoCompositionTrack setPreferredTransform:[[[vA tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] preferredTransform]]; 
    if(error) 
     NSLog(@"%@", error); 
} 

if(aA) { 
    audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [audioCompositionTrack insertTimeRange:audioTimerange ofTrack:[[aA tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:&error]; 
    if(error) 
     NSLog(@"%@", error); 
} 

CGSize videoSize = [videoCompositionTrack naturalSize]; 

UIImage *myImage = [UIImage imageNamed:@"cover.png"]; 
CALayer *aLayer = [CALayer layer]; 
aLayer.contents = (id)myImage.CGImage; 
aLayer.frame = CGRectMake(5, 25, 100, 56); 
aLayer.opacity = 0.7; 

CATextLayer *titleLayer = [CATextLayer layer]; 
titleLayer.string = titleText; 
titleLayer.fontSize = 18; 
titleLayer.foregroundColor = titleColor.CGColor; 
titleLayer.alignmentMode = kCAAlignmentCenter; 
titleLayer.frame = CGRectMake(20, 10, videoSize.width - 40, 20); 
[titleLayer displayIfNeeded]; 

CALayer *parentLayer = [CALayer layer]; 
CALayer *videoLayer = [CALayer layer]; 
parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
[parentLayer addSublayer:videoLayer]; 
[parentLayer addSublayer:aLayer]; 
if(titleText && [titleText length] > 0) { 
    [parentLayer addSublayer:titleLayer]; 
} 

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

AVAssetTrack *videoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
[instruction setTimeRange:CMTimeRangeMake(kCMTimeZero, [mixComposition duration])]; 
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
videoComp.instructions = [NSArray arrayWithObject:instruction]; 

AVAssetExportSession *_assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality]; 
_assetExport.videoComposition = videoComp; 
_assetExport.outputFileType = AVFileTypeMPEG4; 
_assetExport.outputURL = outputFileUrl; 

[_assetExport exportAsynchronouslyWithCompletionHandler:^{ 
    AVAssetExportSessionStatus status = [_assetExport status]; 
    switch (status) { 
     case AVAssetExportSessionStatusFailed: 
      NSLog(@"Export Failed"); 
      NSLog(@"Export Error: %@", [_assetExport.error localizedDescription]); 
      NSLog(@"Export Error Reason: %@", [_assetExport.error localizedFailureReason]); 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      NSLog(@"Export Completed"); 
      [self performSelectorOnMainThread:@selector(updateProgressIndicator:) withObject:[NSNumber numberWithFloat:2] waitUntilDone:YES]; 
      break; 
     case AVAssetExportSessionStatusUnknown: 
      NSLog(@"Export Unknown"); 
      break; 
     case AVAssetExportSessionStatusExporting: 
      NSLog(@"Export Exporting"); 
      break; 
     case AVAssetExportSessionStatusWaiting: 
      NSLog(@"Export Waiting"); 
      break; 
    } 
}]; 

Antwort

6

Ich fand heraus, was ich tun musste. Es war wirklich nichts besonderes. Es bedurfte nur eines besseren Verständnisses dessen, was alles möglich war.

Im Grunde genommen musste ich nur eine einfache Opazitätsanimation zur Ebene hinzufügen, in der sich Text befand.

// My original code for creating the text layer 
CATextLayer *titleLayer = [CATextLayer layer]; 
. 
. 
. 
[titleLayer displayIfNeeded]; 

// the code for the opacity animation which then removes the text 
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
[animation setDuration:0]; 
[animation setFromValue:[NSNumber numberWithFloat:1.0]]; 
[animation setToValue:[NSNumber numberWithFloat:0.0]]; 
[animation setBeginTime:1]; 
[animation setRemovedOnCompletion:NO]; 
[animation setFillMode:kCAFillModeForwards]; 
[titleLayer addAnimation:animation forKey:@"animateOpacity"]; 
+0

Sie konnten den Alpha-Wert nicht direkt auf der titleLayer setzen? Warum mussten Sie CABasicAnimation verwenden? – Crashalot

+1

@scott F Wie kann ein bestimmter Zeitbereich angegeben werden? –

+0

@PayalManiyar, indem Sie die Animation beginTime & Dauer einstellen –

Verwandte Themen