高性能且灵活的 iOS 视频剪辑与特效开源框架 – VideoLab

今天的分享主要包含以上六个方面,首先会对个人及公司做个简介,其次会介绍VideoLab是什么,第三点会介绍VideoLab的技术选型,第四点介绍AVFoundation框架,接着会介绍VideoLab的设计与实现,最后会介绍VideoLab后续的计划。

1. 个人及公司简介

首先,先介绍下个人及公司。

接着简单介绍下RingCentral,从右边的图可以看出我们公司主要包含 Message/Video/Phone三块业务。Message是最右下角的IM聊天,Video是视频会议,Phone是最早的打电话功能。我们公司连续七年获得统一通信及服务的领导者,总部位于美国硅谷,铃胜中国成立于 2011,目前在杭州,厦门,香港均有办公室。

2. VideoLab 是什么/strong>

接着让我们来聊下VideoLab是什么/p>

让我们来看下一些Gif的示例,第一张图片是多图层的一个示例,组合了三个视频,一张图片。第二张是一个拆字的文字动画。第三张是渐隐渐显加Transform的关键帧动画。第四张是类似AE里预合成的动画。第五张是zoom blur转场的示例。

3. 框架技术选型

接着让我们来谈谈框架的技术选型。

首先来看下AVFoundation视频剪辑的整体工作流程:

第一步,创建一个或多个AVAsset。AVAsset是有时间的,模拟音视频实体的对象。

第二步,创AVComposition、AVVideoComposition以及 AVAudioMix。其中AVComposition指定了音视频轨道的时间对齐,AVVideoComposition 指定了视频轨道在任何给定时间点的几何变换与混合,AVAudioMix管理音频轨道的混合参数。这三个对象是视频剪辑最主要的三个类,可以把第一个类的作用理解为摆放音视频轨道,第二个类处理视频混合,第三个类处理音频混合。

设想图中所示的场景,AVComposition包含两个 AVCompositionTrack。我们在T1 时间点需要混合两个 AVCompositionTrack的图像。为了达到这个目的,我们需要使用 AVVideoComposition。

AVAudioMix在AVComposition的音频轨道上处理音频。包含一组AVAudioMixInputParameters,每个Parameters对应一个音频的 AVCompositionTrack。右边的图片是一个示例,可以看到AVCompositionTrack和AVAudioMixInputParameters是一一对应的。

5. VideoLab 设计与实现

前面我们介绍了AVFoundation视频剪辑流程,接下来我们介绍下VideoLab框架的设计与实现。

基于前面对 AE 的分析,我们可以设计相似的描述方式:

RenderComposition,对应AE中的合成。包含一组RenderLayer。此外,RenderComposition还包含BackgroundColor、FrameDuration、RenderSize,分别对应背景色、帧率及渲染大小等剪辑相关参数。

RenderLayerGroup,对应 AE 的预合成。这个Group继承自RenderLayer,包含一组RenderLayer。可以理解成先把一组视频或图片处理完,再去做合成。

KeyframeAnimation,对应 AE 的关键帧动画。包含了KeyPath、Values、KeyTimes、缓动函数数组。

从上面的图示可以看到,我们可以灵活自由的放置这些区域。

那VideoLab是如何把这些描述对象转换为AVFoundation的三大对象的呢/p>

先来看下AVComposition,我们需要给AVComposition分别添加视频轨道与音频轨道。如图所示,这个RenderComposition包含6个RenderLayer,其中一个是RenderLayerGroup。

第一步是将RenderLayer转换VideoRenderLayer,VideoRenderLayer 是框架内部对象,包含一个RenderLayer,主要负责将RenderLayer的视频轨道添加到AVComposition中。可转换为VideoRenderLayer的 RenderLayer包含以下几类:1. Source包含视频轨道;2. Source为图片类型;3. 特效操作组不为空(Operations)。

让我们接着聊下添加音频轨道,添加音频轨道第一步是将RenderLayer 转换为AudioRenderLayer,AudioRenderLayer是框架内部对象,包含一个RenderLayer,主要负责将RenderLayer的音频轨道添到AVComposition中。可转换为AudioRenderLayer的RenderLayer只需满足一个条件:Source包含音频轨道。转换AudioRenderLayer之后如右图所示。

接下来介绍一下关于渲染的实现。从前面的AVFoundation介绍可知,AVVideoComposition可以用来指定渲染大小和渲染缩放,以及帧率。此外,还有一组存储了混合参数的指令。有了这些指令后,AVVideoComposition可以通过自定义混合器来混合对应的图像帧。

第一步是创建指令,我们会在时间轴上标记每个VideoRenderLayer的起始时间点与结束时间点。然后为每个时间间隔创建一个Instruction,与时间间隔有交集的VideoRenderLayer,都作为Instruction的混合参数。

然后我们对前面的Compositor工作流程做一个更新,将混合参数更新为与Instruction有交集的VideoRenderLayer组。对于混合规则的话,是按层级渲染,从下往上。如当前层级有纹理则先处理自己的纹理,再混合进前面的纹理。

首先是支持OpenGL,GL还是目前大多数公司选择渲染引擎的首选,VideoLab 的规划是能同时支持Metal + OpenGL,使用方决定渲染引擎使用Metal或Open GL。其次会持续完善特性,如变速、更便捷的转场使用方式。接下来会开始写有UI交互的Demo,这样可能会更直接一些。最后,当然期望VideoLab是可以跨平台,期望是上层能有统一的C++封装API,统一设计思路,底下用各自的平台优势,比如iOS用AVFoundation 做编解码,Android用 FFmpeg;iOS用Metal/GL,Android用Vulkan/GL。

最后也是期望能有更多的人参与维护,毕竟一个人的能力比较有限,大家一起维护能有更多的未来畅想。

这里附带上Github地址:https://github.com/ruanjx/VideoLab

以上是我的全部分享,谢谢大家。


讲师招募

LiveVideoStackCon 2022 音视频技术大会 上海站,正在面向 会公开招募讲师,无论你所处的公司大小,title高低,老鸟还是菜鸟,只要你的内容对技术人有帮助,其他都是次要的。欢迎通过 speaker@livevideostack.com 提交个人资料及议题描述,我们将会在24小时内给予反馈。

喜欢我们的内容就点个“在看”吧!

7f4f9dc77b8241f0e7b78b2d8365a59c.gif

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91286 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年11月8日
下一篇 2021年11月8日

相关推荐