添加AVMutableVideoComposition的文本覆盖到特定的时间范围

我发现了一些示例,展示了如何在video上添加文字叠加层。

Ray的教程 – http://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos

这就是答案 – 如何在iOS上捕获的video中添加水印

还有一些我也提到了。 我的代码看起来几乎与该答案相同,我一直在试图调整它以使文本覆盖在video的开头只显示一两秒钟。 任何帮助,我怎么能做到这一点?

这是我的代码。 这是工作原理导出video覆盖显示整个持续时间。

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; } }]; 

我想清楚我需要做什么。 这真的没什么特别的。 它只是需要更好的了解什么是可能的。

基本上我所要做的只是添加一个基本的不透明度animation到其中有文字的图层。

 // 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"];