微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 AVAssetExportSession

如何解决通过 AVAssetExportSession

我在视频上添加一个子类 CALayer,并使用 AVAssetExportSession 导出,但我很难让 CABasicAnimation 为自定义属性工作。我开始采用这种方法Core animation callback for progress

一个“progress”属性,我使用 CABasicAnimation 从 0 缩放到 1 以匹配视频的时间。在屏幕上,在一个带有 AVSynchronizedLayer 的 playerView 中,“进度”得到更新,一切都是笨拙的。它完全按照我的预期工作。

然而,在导出时,进度参数的 CABasicAnimation 似乎没有更新。我可以为动画设置不同的“from”值,并且“progress”值设置为渲染的第一帧的值——但在此之后永远不会改变。我检查了 CALayer 以及模型和表示层,它们都有初始的“from”值,每次渲染一帧时。

如果我将其他 CABasicAnimation 对象附加到我的图层(例如缩放、位置),它们会按预期工作。

我的整体流程有点像这样

  • 创建了 AVMutableComposition,插入了音频和视频轨道
  • 构建层视图层次结构,附加 CABasicAnimation 对象。一个动画是针对“progress”参数的,这就是问题所在。
  • 创建了 AVVideoCompositionCoreAnimationTool,将视频与 CA 层连接起来
  • AVAssetExportSession 生成视频

与库存动画关键路径相关的参数似乎没问题。 “进步”的关键路径似乎没有更新。我怀疑 AVSynchronizedLayer 为屏幕上的更新做了一些事情,而这不会发生在会话导出中——但我不知道我需要做什么。

我的 CALayer 子类实现了 NeeddisplayForKey,并且在渲染开始之前它会检查“progress”键——所以我认为 CABasicAnimation 和渲染管道知道“progress”应该改变。

    + (BOOL)needsdisplayForKey:(Nsstring*)key {
      if ([key isEqualToString:@"progress"])
        return YES;
      return [super needsdisplayForKey:key];
    }

我的工作理论是 AVVideoCompositionCoreAnimationTool 看到我的“进度”关键路径的基本动画,在渲染开始时将事物设置为起始值,然后在渲染进行时不更新。以及它不更新的原因? 因为我精力充沛,完全错过了做一些重要的事情。

如果有关于添加时间码叠加的示例,那就太好了。我不认为我在做什么是异国情调,它在屏幕上效果很好,但我显然错过了视频导出的一些技巧。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。