今天下午,一个csdn上的朋友加我QQ,问我如何在指定时间段内给视频添加水印,很小众的需求,但是确实有一些应用场景。我研究了一下,在之前加水印的基础上,加了一个动画,效果还可以,故分享给大家。
- (void)applyVideoEffectsToComposition:(AVMutableVideoComposition *)composition size:(CGSize)size{
// 1 - set up the overlay
CALayer *overlayLayer = [CALayer layer];
UIImage *overlayImage = [UIImage imageNamed:@"waterMark"];
[overlayLayer setContents:(id)[overlayImage CGImage]];
overlayLayer.frame = CGRectMake(size.width - 146, 24, 135, 18);
[overlayLayer setMasksToBounds:YES];
// 2 - set up the parent layer
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:overlayLayer];
//*********** For A Special Time
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
[animation setDuration:0];
[animation setFromValue:[NSNumber numberWithFloat:1.0]];
[animation setToValue:[NSNumber numberWithFloat:0.0]];
[animation setBeginTime:5];
[animation setRemovedOnCompletion:NO];
[animation setFillMode:kCAFillModeForwards];
[overlayLayer addAnimation:animation forKey:@"animateOpacity"];
// 3 - apply magic
composition.animationTool = [AVVideoCompositionCoreAnimationTool
videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
}
其中,//* For A Special Time 代码段的内容,表示在第5秒的时候,将水印隐藏,从而达到了水印只显示前5秒的效果。如果想实现其他效果,只要对layer的 opacity 属性做修改即可。