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

标签 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
...

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

如有任何建议,我们将不胜感激。

最佳答案

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

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

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

因此,您可以为 CATextLayer 指定一个 name。在你的情况下它是你的 titleLayer:

titleLayer.name = "changingTextLayer"

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

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

一旦找到它,您就可以更改文本:

titleLayer.string = @"Changed text";

您现在所要做的就是设置一个计时器并每隔一秒/您提供的时间间隔执行一次,直到数组中有字符串。

您必须将 CALayer 转换为 CATextLayer

祝你好运。

关于ios - 在 AVMutableVideoComposition 中创建一个按时间间隔更改的 CATextlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11025965/

相关文章:

ios - 当音频持续时间小于视频持续时间时合并音频/视频

swift - 如何合并 2 个带有淡入淡出过渡的视频?

iphone - 更改 UIView 的 CALayer 框架(self.view.layer.frame = ...)似乎没有效果

ios - 使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码

ios - 从标签栏 Controller 注销到 Root View Controller

javascript - react native 相机 | ios10 - 渲染 <Camera/> 时应用程序崩溃

ios - 如何为 UIViews 'center' 属性设置动画?

iphone - 我可以使用 CGAffineTransformMakeRotation 将 View 旋转超过 360 度吗?

ios - iOS中的视频重叠

ios - 需要帮助设置数据模型以显示 tableView