使用 CAKeyframeAnimation 在视频上添加动画层

Adding animated layer on video using CAKeyframeAnimation

我正在尝试向我的视频添加叠加层,其中包含一个内容随时间变化的子层。所以我将 CAKeyframeAnimation 添加到层中,如下所示:

CALayer *overlayLayer = [CALayer layer];
[overlayLayer setFrame:CGRectMake(0, 0, size.width, size.height)];
[overlayLayer setMasksToBounds:YES];

NSArray *frames = [self.gifImage frames];

CALayer *aLayer = [CALayer layer];
UIImage *firstImage = [frames objectAtIndex:0];
CGFloat nativeWidth = CGImageGetWidth(firstImage.CGImage);
CGFloat nativeHeight = CGImageGetHeight(firstImage.CGImage);
CGRect frame = CGRectMake(0.0, 0.0, nativeWidth, nativeHeight);
aLayer.frame = frame;
aLayer.contents = (id)firstImage.CGImage;
[aLayer setMasksToBounds:YES];

CAKeyframeAnimation *animationSequence = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
animationSequence.calculationMode = kCAAnimationDiscrete;
animationSequence.duration = [self.gifImage totalDuration];
animationSequence.repeatCount = HUGE_VALF;

NSMutableArray *animationSequenceArray = [[NSMutableArray alloc] init];
for (UIImage *image in frames) {
    [animationSequenceArray addObject:(id)image.CGImage];
}

animationSequence.values = animationSequenceArray;
[aLayer addAnimation:animationSequence forKey:@"contents"];
[overlayLayer addSublayer:aLayer];

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

composition.animationTool = [AVVideoCompositionCoreAnimationTool
                             videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

不知何故,当我将 aLayer 添加为我的视图的子层时,它会正确地设置动画。但是当我将它添加到视频的叠加层时,动画不起作用。我在这里缺少什么吗?感谢任何帮助。

我终于通过将 calculationMode 更改为 kCAAnimationLinear 解决了这个问题。这似乎是一个愚蠢的问题,但我希望它可能对某人有用。

如果你使用 kCAAnimationDiscrete,这里有一个清单:

  • keyTimes 需要一个 0-1 的值,而不是时间
  • keyTimes 必须从 0.0 开始并以值 1.0 结束
  • keyTimes 的值必须比您的动画帧数多 1