AVComposition中的CALayer

来源:互联网 发布:2016美容行业数据 编辑:程序博客网 时间:2024/05/29 08:08

http://blog.csdn.net/xiaolinyeyi/article/details/51755235

AVMutableComposition除了可以插入视频轨道、音频轨道外,还可以在上面覆盖layer,以添加水印、动画等。想想新闻联播下面转圈的地球,这种效果没有layer还真不好做

AVVideoCompositionCoreAnimationTool

AVVideoCompositionCoreAnimationTool用来将 Core Animation 作为视频组合的后期处理阶段纳入 video composition 中

这里写图片描述

videoLayer 是video composition展现时的图层,animationLayer 是我们要在其上覆盖用的图层。AVVideoCompositionCoreAnimationTool用于将 animationLayer 添加到 videoLayer 上。 
使用AVVideoCompositionCoreAnimationTool时需要注意:

  • 动画时间坐标与视频时间坐标不一样,如果 beginTime = 0,则表示动画开始时间为CACurrentMediaTime,这与渲染视频的时间完全不同——渲染时“当前时间”早就过去了。AVFoundation设置了AVCoreAnimationBeginTimeAtZero常量来将 Core Animation 的beginTime设为视频时间坐标的0
  • 默认情况下,动画完成后,为提高性能,图层会把动画移除,这样动画的时间一旦过去就无法返回了,但这种逻辑不符合视频动画:因为可能会重新播放等,所以removedOnCompletion必须置为NO
  • 添加的 layer 不能与UIView有关系

示例

如果没有视频轨道(如纯layer的composition),则必须添加一个空白视频,否则什么也渲染不出来

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// 初始化 composition, videoComposition <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>// parent layerCALayer *parentLayer = [CALayer layer];parentLayer.frame = (视频frame)// video layerCALayer *videoLayer = [CALayer layer];videoLayer.frame = parentLayer.frame;// animation/overlay layerCALayer *layer1 = [CALayer layer];CALayer *layer2 = [CALayer layer];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>// 在layer上想做什么就可以做什么,如添加动画CABaseAnimation *animation = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>animation.fromValue = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>animation.toValue = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>animation.beginTime = AVCoreAnimationBeginTimeAtZero;animation.removedOnCompletion = NO;[layer1 addAnimation: animation forKey: nil];// 将自定义的layer添加到parentLayer中[parentLayer addSublayer: videoLayer];[parentLayer addSublayer: layer1];[parentLayer addSublayer: layer2];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>// 将合成的parentLayer关联到composition中videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer: videoLayer inLayer: parentLayer];// 用AVAssetExportSession导出</code>

0 0
原创粉丝点击