AVComposition中的CALayer

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
  • basicAnimation.beginTime = AVCoreAnimationBeginTimeAtZero;
  • 默认情况下,动画完成后,为提高性能,图层会把动画移除,这样动画的时间一旦过去就无法返回了,但这种逻辑不符合视频动画:因为可能会重新播放等,所以removedOnCompletion必须置为NO
  • 添加的 layer 不能与UIView有关系
示例
如果没有视频轨道(如纯layer的composition),则必须添加一个空白视频,否则什么也渲染不出来

    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(0, 0, 100, 100);
    layer.backgroundColor = [UIColor blackColor].CGColor;
    //创建动画并指定动画属性
    CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    //设置动画初始值和结束值
    basicAnimation.toValue = [NSNumber numberWithFloat:M_PI];
    //设置其动画属性
    basicAnimation.beginTime = AVCoreAnimationBeginTimeAtZero;
    basicAnimation.duration = 3.0;
    basicAnimation.autoreverses = true;
    basicAnimation.repeatCount = HUGE_VAL;
    basicAnimation.removedOnCompletion = NO;
    [layer addAnimation:basicAnimation forKey:@"jeffasd_rotation"];
    
    //CALayer *waterMarkLayer = label.layer;
    CALayer *waterMarkLayer = layer;
    CALayer *parentLayer = [CALayer layer];
    CALayer *videoLayer = [CALayer layer];
    parentLayer.frame = CGRectMake(0, 0, videoComposition.renderSize.width, videoComposition.renderSize.height);
    videoLayer.frame = CGRectMake(0, 0, videoComposition.renderSize.width, videoComposition.renderSize.height);
    [parentLayer addSublayer:videoLayer];
    waterMarkLayer.position = CGPointMake(videoComposition.renderSize.width/2, videoComposition.renderSize.height/2);
    [parentLayer addSublayer:waterMarkLayer];
    videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值