【问题标题】:Adding animated layer on video using CAKeyframeAnimation使用 CAKeyframeAnimation 在视频上添加动画层
【发布时间】:2015-01-01 17:45:02
【问题描述】:

我正在尝试向我的视频添加一个叠加层,其中包含一个内容随时间变化的子层。所以我将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 添加为视图的子层时,它会正确地进行动画处理。但是当我将它添加到视频的叠加层时,动画不起作用。我在这里缺少什么吗?任何帮助表示赞赏。

【问题讨论】:

标签: objective-c avfoundation calayer cakeyframeanimation avassetexportsession


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 嗨@friedegg-bacon-sandwich,你能分享更多细节吗?我正在尝试做同样的事情,但无法在视频中获得精灵动画。如果我使用 CABasicAnimation 对不透明度进行动画处理,它工作得很好,我可以在视频上获得一个带有淡入/淡出动画的虚拟层。但是,当尝试像您一样使用 CAKeyframeAnimation 添加动画精灵时,我什么也得不到。
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多