[ios] Animation d'image AVPlayer



Answers

Question

Je développe une application qui inclut la fonctionnalité pour lire la vidéo avec l'animation par image. Vous pouvez voir un exemple de cette fonctionnalité.

J'ai déjà essayé d'ajouter CAKeyFrameAnimation à la sous-couche de AVSynchronizedLayer et j'ai quelques problèmes avec elle.

J'ai déjà essayé de pré-rendre la vidéo avec AVAssetExportSession , et cela fonctionne parfaitement. Mais c'est très lent. Il faut jusqu'à 3 minutes pour rendre cette vidéo.

Peut-être qu'il existe d'autres approches pour le faire?

Mettre à jour:

Voici comment AVSynchronizedLayer animation avec AVSynchronizedLayer :

let fullScreenAnimationLayer = CALayer()
fullScreenAnimationLayer.frame = videoRect
fullScreenAnimationLayer.geometryFlipped = true

values: [NSValue] = [], times: [NSNumber] = []

// fill values array with positions of face center for each frame
values.append(NSValue(CATransform3D: t))

// fill times with corresoinding time for each frame
times.append(NSNumber(double: (Double(j) / fps) / videoDuration)) // where fps = 25 (according to video file fps)

...

let transform = CAKeyframeAnimation(keyPath: "transform")
transform.duration = videoDuration
transform.calculationMode = kCAAnimationDiscrete
transform.beginTime = AVCoreAnimationBeginTimeAtZero
transform.values = values
transform.keyTimes = times
transform.removedOnCompletion = false
transform.fillMode = kCAFillModeForwards
fullScreenAnimationLayer.addAnimation(transform, forKey: "a_transform")

...

if let syncLayer = AVSynchronizedLayer(playerItem: player.currentItem) {
    syncLayer.frame = CGRect(origin: CGPointZero, size: videoView.bounds.size)
    syncLayer.addSublayer(fullScreenAnimationLayer)
    videoView.layer.addSublayer(syncLayer)
}



Related