AVVideoCompositionCoreAnimationTool 继承自NSObject
,用于将Core Animation
合并到视频合成中的对象。
任何动画都将在视频的时间轴上非实时的执行,因此应该:
- 将动画的
beginTime
属性设置为AVCoreAnimationBeginTimeAtZero
而不是0(CoreAnimation
替换为CACurrentMediaTime
); - 将
removedOnCompletion
设置为NO,使动画不会自动删除; - 避免使用与
UIView
对象关联的图层。
、创建合成工具
1、将核心动画层添加到视频合成中
+ (instancetype)videoCompositionCoreAnimationToolWithAdditionalLayer:(CALayer *)layer
asTrackID:(CMPersistentTrackID)trackID;
将核心动画层添加到视频合成中:
- 参数
layer
:要添加的Core Animation
层。 - 参数
trackID
:用于标识轨道的trackID
。trackID
不应该匹配源中的任何实际trackID
。
可以使用此方法将Core Animation
图层包含为视频合成中的单个轨道输入。视频合成指令应引用应包含渲染动画的trackID
。
2、使用核心动画层构成合成视频帧
+ (instancetype)videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:(CALayer *)videoLayer
inLayer:(CALayer *)animationLayer;
使用核心动画层构成合成视频帧:
- 参数
videoLayer
:一个视频层。 - 参数
animationLayer
:动画层。
将合成的视频帧放在videoLayer
中并渲染animationLayer
以生成最终帧。
videoLayer
应该在animationLayer
子层树中;animationLayer
不应来自或添加到另一个图层树。
3、使用Core Animation
层组合合成的视频帧
+ (instancetype)videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayers:(NSArray<CALayer *> *)videoLayers
inLayer:(CALayer *)animationLayer;
使用Core Animation
层组合合成的视频帧:
- 参数
videoLayers
:一组视频层 - 参数
animationLayer
:动画层。
复制每个videoLayer
中的合成视频帧,并渲染animationLayer
以生成最终帧。videoLayers
应该在animationLayer
的子层树中。
animationLayer
不应该来自另一层树,也不应该添加到另一层树。
注意:在iOS中,支持UIView
的层实例通常会翻转它们的内容,这是由-contentsAreFlipped
方法定义的。可能需要在图层层次结构中插入其geometryFlipped
属性设置为YES的CALayer
实例,以便在图层备份UIView
时将图层附加到接收器时获得相同的结果。