AVMutableComposition
除了可以插入视频轨道、音频轨道外,还可以在上面覆盖layer,以添加水印、动画等。想想新闻联播下面转圈的地球,这种效果没有layer还真不好做
AVVideoCompositionCoreAnimationTool
用来在 video composition 中混合 Core Animation
videoLayer 是video composition展现时的图层,animationLayer 是我们要在其上覆盖用的图层。AVVideoCompositionCoreAnimationTool
用于将 animationLayer 添加到 videoLayer 上。
使用AVVideoCompositionCoreAnimationTool
时需要注意:
beginTime
= 0,则表示动画开始时间为CACurrentMediaTime
,这与渲染视频的时间完全不同——渲染时“当前时间”早就过去了。AVFoundation
设置了AVCoreAnimationBeginTimeAtZero
常量来将 Core Animation 的beginTime
设为视频时间坐标的0removedOnCompletion
必须置为NO
UIView
有关系如果没有视频轨道(如纯layer的composition),则必须添加一个空白视频,否则什么也渲染不出来
// 初始化 composition, videoComposition ...
// parent layer
CALayer *parentLayer = [CALayer layer];
parentLayer.frame = (视频frame)
// video layer
CALayer *videoLayer = [CALayer layer];
videoLayer.frame = parentLayer.frame;
// animation/overlay layer
CALayer *layer1 = [CALayer layer];
CALayer *layer2 = [CALayer layer];
...
// 在layer上想做什么就可以做什么,如添加动画
CABaseAnimation *animation = ...
animation.fromValue = ...
animation.toValue = ...
animation.beginTime = AVCoreAnimationBeginTimeAtZero;
animation.removedOnCompletion = NO;
[layer1 addAnimation: animation forKey: nil];
// 将自定义的layer添加到parentLayer中
[parentLayer addSublayer: videoLayer];
[parentLayer addSublayer: layer1];
[parentLayer addSublayer: layer2];
...
// 将合成的parentLayer关联到composition中
videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer: videoLayer inLayer: parentLayer];
// 用AVAssetExportSession导出