我正在创建一个应用来操作视频,现在我在视频上方添加了精灵动画。
为此我使用CAKeyframeAnimation,我在Manager中添加了一个添加动画精灵的方法。
// add effect on the video
[EffectManager addEffectOnVideoAtURL:outputURL handler:^{
NSLog(@"video exported with aimations");
}];
当这个videoURL存储在我的应用程序的文档文件夹中时,CAKeyframeAnimation不可见。
但是当我第一次将视频导出到库/相机胶卷,然后加载并添加效果时,它们就会显示在这个导出的视频上。
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// export the video to the library/camera roll
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL]) {
[library writeVideoAtPathToSavedPhotosAlbum:outputURL completionBlock:^(NSURL *assetURL, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
// add effect on the video
[EffectManager addEffectOnVideoAtURL:assetURL handler:^{
NSLog(@"video exported with aimations");
}];
});
}];
}
此代码使用该库工作正常,但我不想将中间视频保存到库中。
我试图以异步方式使用第一段代码,但结果是一样的。
我还尝试从库加载电影,并使用第一段代码,但结果相同,没有CAKeyframeAnimation。
知道为什么只有在视频首次导出到lbrary / photo roll时CAKeyframeAnimation才可见?
答案 0 :(得分:0)
它最终与PhotoScroll无关。
默认情况下,CAKeyFrameAnimation.removedOnCompletion设置为YES。 当它被添加到CALayer时,它会混淆videoexport。
因此,通过将其设置为NO,可以在动画上看到CAKeyFrameAnimation。
NSMutableArray* animationArray = [NSMutableArray array];
UIImage*img1 = [UIImage imageWithContentsOfFile:path];
[animationArray addObject:(__bridge id)[img1 CGImage]];
UIImage*img2 = [UIImage imageWithContentsOfFile:path];
[animationArray addObject:(__bridge id)[img2 CGImage]];
CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
[animation setCalculationMode:kCAAnimationDiscrete];
[animation setDuration:0.5f];
[animation setRepeatCount:HUGE_VALF];
[animation setValues:[[NSArray alloc] initWithArray:animationArray]];
// this line does the fix:
animation.removedOnCompletion = NO;