创建一个在AVMutableVideoComposition中以一定间隔更改的CATextlayer

时间:2012-06-14 02:42:35

标签: ios core-animation avmutablecomposition catextlayer

我有一个应用程序,允许用户以可变组合录制视频。我想设置一些文本,然后以用户在导出后播放时设置的间隔进行更改。

例如,如果第一个单词是“dog”,那么我想设置它以便“cat”在X秒后替换该字符串,然后在X秒后用另一个单词替换。

我的视频是使用AVExportSession从AVMutableComposition导出的,我的文字将使用添加的CATextlayer添加,如下所示:

//code to setup AVMutableComposition
...
//code to setup CATextLayer and AVMutableVideoComposition
    CALayer *animatedTitleLayer = [CALayer layer];
    CATextLayer *titleLayer = [[CATextLayer alloc] init];
    titleLayer.string = @"Text I want to change at an interval";
    titleLayer.alignmentMode = kCAAlignmentCenter;
    titleLayer.bounds = CGRectMake(150, 50, 124, 354);
    titleLayer.position = CGPointMake(120, 270);
    titleLayer.bounds = CGRectIntegral(CGRectMake(0, 0, 250, 150));
    titleLayer.opacity = 1;
    titleLayer.backgroundColor = [UIColor purpleColor].CGColor;   
    [animatedTitleLayer addSublayer:titleLayer];
    animatedTitleLayer.position = CGPointMake(40, 5);        
    CALayer *parentLayer = [CALayer layer];
    CALayer *videoLayer = [CALayer layer];
    parentLayer.frame = CGRectMake(0, 0, 320, 480);
    videoLayer.frame = CGRectMake(0, 0, 320, 480);
    [parentLayer addSublayer:videoLayer];
    [parentLayer addSublayer:animatedTitleLayer];   
    parentLayer.preferredTransform = rotationTransform;
    AVMutableVideoComposition *videoComposition;
    videoComposition = [AVMutableVideoComposition videoComposition];
    videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

//code to setup AVExportSession
...

我的问题是:如何以我设置为我指定的字符串的间隔更改文本?

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您要实现的是在运行时以一定的间隔更改CATextLayer的文本,那么您的一个选择是在层次结构中搜索该层并在某种计时器线程上更改其文本。提供了要替换的字符串数组,您可以在运行时找到它的文本。

您可以先解决手头的第一个问题: 搜索层次结构中的图层

CALayer的所有子类都定义了一个属性,用于标识层次结构中name的图层。

所以你能做的就是给name CATextLayer titleLayer。在你的情况下,它是你的titleLayer.name = "changingTextLayer"

for (CALayer *layer in [superLayerOfMyLayer sublayers]) {
        if ([[layer name] isEqualToString:"changingTextLayer"]) {
            return layer;
        }
    }

然后你可以在层次结构中搜索它:

titleLayer.string = @"Changed text";

一旦找到,就可以更改文字:

CALayer

现在你要做的就是设置一个计时器并每隔一秒/你提供的时间间隔执行此操作,直到数组中有字符串为止。

您必须将CATextLayer投射到nvarchar(max)

祝你好运。