导出视频后,CAKeyframeAnimation没有动画效果

时间:2016-06-11 11:13:12

标签: ios objective-c swift video calayer

我对CAKeyframeAnimation有很大的问题。有一个功能可以在用户选择动画后创建所选动画。所有数据都在准备好的字典中。有一个代码:

        //Prepare settings
        let settings = dataManager.getFreeEffectsSettingsForFileName("")

        //Set origin
        let freeEffectOrigin = settings.objectForKey("freeEffectOrigin") as! [String: NSNumber]
        let xOrigin: NSNumber = freeEffectOrigin["x"]! as NSNumber
        let yOrigin: NSNumber = freeEffectOrigin["y"]! as NSNumber

        //Set size
        let freeEffectSize = settings.objectForKey("freeEffectSize") as! [String: NSNumber]
        let widthSize: NSNumber = freeEffectSize["width"]! as NSNumber
        let heightSize: NSNumber = freeEffectSize["height"]! as NSNumber

        //Set frame with origin and size
        freeEffectAnimationImage = UIImageView(frame: CGRectMake(CGFloat(xOrigin), CGFloat(yOrigin), CGFloat(widthSize), CGFloat(heightSize)))
        freeEffectAnimationImage.image = dataManager.getFreeEffectsImagesForFileName("")[0] as? UIImage

        //set begining point
        let freeEffectBeginingPoint = settings.objectForKey("beginingPoint") as! [String: NSNumber]
        let xBeginingPoint: NSNumber = freeEffectBeginingPoint["x"]! as NSNumber
        let yBeginingPoint: NSNumber = freeEffectBeginingPoint["y"]! as NSNumber

        beginingPoint = CGPointMake(CGFloat(xBeginingPoint), CGFloat(yBeginingPoint))

        //set ending point
        let freeEffectEndingPoint = settings.objectForKey("endingPoint") as! [String: NSNumber]
        let xEndingPoint: NSNumber = freeEffectEndingPoint["x"]! as NSNumber
        let yEndingPoint: NSNumber = freeEffectEndingPoint["y"]! as NSNumber

        endingPoint = CGPointMake(CGFloat(xEndingPoint), CGFloat(yEndingPoint))

        freeEffectAnimationImage.center = beginingPoint

        freeEffectAnimationView.addSubview(freeEffectAnimationImage)

        let animationCGImagesArray = NSMutableArray()
        let animationImages = dataManager.getFreeEffectsImagesForFileName("") as! [UIImage]

        for image: UIImage in animationImages {
            animationCGImagesArray.addObject(image.CGImage!)
        }

        let animation = CAKeyframeAnimation(keyPath: "contents")
        animation.calculationMode = kCAAnimationDiscrete
        //animation.beginTime = 0.1
        animation.duration = 2.5
        animation.repeatCount = 50
        //animation.keyTimes = [0.0, 0.4, 0.7, 1.0]
        animation.autoreverses = false
        animation.values = animationCGImagesArray as [AnyObject]
        animation.removedOnCompletion = false
        animation.fillMode = kCAFillModeForwards

        freeEffectAnimationImage.layer.addAnimation(animation, forKey: "contents")

之后,用户可以保存此动画并将其分层放在视频上。有一种方法可以分层电影:

VideoSaver.saveVideo(videoAsset!) {
        (composition, size) in
        ////////////////
        //Parent Layer//
        ////////////////

        let parentLayer = CALayer()
        parentLayer.frame = CGRectMake(0, 0, size.width, size.height)

        ///////////////
        //Video Layer//
        ///////////////
        let videoLayer = CALayer()
        videoLayer.frame = CGRectMake(0, 0, size.width, size.height)

        //////////////////////////
        //Animation Layout Layer//
        //////////////////////////
        let animationOverlayLayer = AVSynchronizedLayer()
        animationOverlayLayer.contents = self.freeEffectAnimationImage.image?.CGImage
        animationOverlayLayer.addAnimation(self.freeEffectAnimationImage.layer.animationForKey("contents")!, forKey: "contents")
        animationOverlayLayer.frame = CGRectMake(self.beginingPoint.x, self.beginingPoint.y, CGRectGetWidth(self.freeEffectAnimationImage.frame), CGRectGetHeight(self.freeEffectAnimationImage.frame))
        animationOverlayLayer.masksToBounds = true

        ///////////////////////////////////////////////

        parentLayer.addSublayer(videoLayer)
        if self.freeEffectAnimationImage.hidden == false {
            parentLayer.addSublayer(animationOverlayLayer)
        }

        ///////////////
        //Composition//
        ///////////////
        composition.animationTool = AVVideoCompositionCoreAnimationTool.init(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
    }

很抱歉这长码但是我坚持了,我必须在星期一完成。如果有人能帮助我,我会很高兴。

1 个答案:

答案 0 :(得分:7)

是的,我修好了。问题是因为我没有指定beginTime。有一个代码:

let animation = CAKeyframeAnimation(keyPath: "contents")
        animation.calculationMode = kCAAnimationDiscrete
        animation.duration = 2.5
        animation.repeatCount = 50
        animation.autoreverses = false
        animation.values = animationCGImagesArray as [AnyObject]
        animation.removedOnCompletion = false
        animation.fillMode = kCAFillModeForwards
        animation.beginTime = AVCoreAnimationBeginTimeAtZero

        freeEffectAnimationImage.layer.addAnimation(animation, forKey: "contents")