我正在尝试在视频上叠加动画gif。由于各种原因,我选择通过在包含名为“ frameIndex”的gif的图层上创建一个可动画处理的属性来完成此操作。当frameIndex从一个值更改为下一个值时,gif框架也会更改。当我将动画gif图层添加到AVSynchronizedLayer并将其同步到AVPlayerItem时,我的gif会随着视频的播放而完美地动画。一切似乎都很好。但是,当我尝试一起导出视频和动画gif时,会出现问题。当我导出时,关于动画开始于哪一帧以及动画中实际显示多少帧以及持续多长时间似乎是非常随机的。
这是相关代码。
动画是这样创建的(减去keyTimes和值的详细信息):
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"frameIndex"];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.calculationMode = kCAAnimationDiscrete;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeBoth;
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
animation.repeatCount = INFINITY;
这是包含gif的图层。 “ frameIndex”是我要设置动画的属性。
@interface AnimatedGifLayer : CALayer
@property (nonatomic) NSUInteger frameIndex;
@end
@implementation AnimatedGifLayer
+ (BOOL)needsDisplayForKey:(NSString *)key {
if( [key isEqualToString:@"frameIndex"] ) {
return YES;
}
return [super needsDisplayForKey:key];
}
- (void)display {
NSUInteger frameIndex = self.presentationLayer.frameIndex;
UIImage *img = [self.animatedImage imageCachedAtIndex:frameIndex];
if( img ) {
self.contents = (id)img.CGImage;
}
}
在播放期间,我可以看到以正确的“ frameIndex”正确调用了“ display”,并且一切正常。
对于导出,有很多东西可以设置构图,然后像这样添加动画:
videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer
inLayer:parentLayer];
我已使用导出代码将其他动画图层导出到视频上,并且在该视频上工作正常。只是在这种情况下,我使用了自定义属性来对它不起作用进行动画处理。
在导出过程中,关于何时调用“显示”似乎是非常随机的。我的猜测是AVVideoCompositionCoreAnimationTool实际上并未使用显示来渲染帧动画,但是我不确定它在使用什么。或者说时机完全不同,但是我不确定那是怎么回事。
请注意,如果我直接为“ contents”属性设置动画,这确实可行,但是由于种种原因,我宁愿让此实现正常工作。
首先感谢所有花时间阅读所有内容并考虑解决方案的人。