在 AVMutableVideoComposition 中创建一个按时间间隔更改的 CATextlayer

Posted

技术标签:

【中文标题】在 AVMutableVideoComposition 中创建一个按时间间隔更改的 CATextlayer【英文标题】:Create a CATextlayer that changes at an interval in an AVMutableVideoComposition 【发布时间】:2012-06-14 02:42:35 【问题描述】:

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

例如,如果第一个单词是“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】:

如果您想要实现的是在运行时以一定间隔更改 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

祝你好运。

【讨论】:

以上是关于在 AVMutableVideoComposition 中创建一个按时间间隔更改的 CATextlayer的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据