背景
在我们的业务产品中,存在大量的音视频素材,都存在二次创作及编辑的需求,而传统的本地编辑器复杂难用,且无法跨平台编辑;第三方云编辑也存在各种限制。而音视频创作作为5G时代的主流内容,我们也可以在这个方向进行技术以储备及发展。
基本功能
-
素材管理、编辑
-
视频裁剪、合并
-
多种格式的导入、导出与转换
-
嵌入字母及编辑
-
多轨道管理:多轨编辑、分离、新增
-
素材效果
-
人脸识别、特效
-
直播实时编辑
云编辑如果需要不受限于本地机器性能,那么视频编辑的主要工作肯定需要在后端写完成,那么就需要考虑几个问题:
-
前端如何实时预览
-
所见即所得,怎么保证预览效果和后端生成效果一致
-
前端编辑性能
技术选型
后端选型
ffmpeg
ffmpeg不多说,如果是个开发人员,可能没有用过,但是应该至少听过,它是一个完整的跨平台解决方案,用于记录,转换和流式传输音频和视频,是视频/音频处理最常用的开源软件。市面上大部分的音视频播放器、剪辑软件,都是基于它实现的。
优点:
功能强大且灵活。几乎可以满足所有的剪辑需求
缺点:
使用C语言开发,如果基于ffmpeg实现,前期可以直接调用编译好的命令行实现基本功能,但是后期肯定是需要基于它的共享库做二次开发。学习成本及维护成本比较高
opencv
opencv虽然底层也用了ffmpeg,但是音视频剪辑不是它的主要方向,它更多的是用来做图像处理,比如对视频做特效:人脸识别、抠图换景、算法贴图等
优势:
强大的图像处理功能,支持与计算机视觉和机器学习有关的多种算法,可以实现各种你想要的图像、视频效果。而且由于它底层也用了ffmpeg和libavcodec,所以即使它并不是主要用于视频编辑,但也可以实现相关的功能。
缺点:
学习成本非常高,且它的性能会比直接用ffmpeg要稍差一些。
moviePy
MoviePy是一个用于视频编辑的Python模块,它可被用于一些基本操作(如剪切、拼接、插入标题)、视频合成(即非线性编辑)、视频处理和创建高级特效。它底层实际上也是调用ffmpeg来处理视频编辑,opencv和其它一些库来实现高级的图片处理。
优点:
上手十分简单,代码简单易懂
缺点:
相比于直接使用ffmpeg、opencv等,性能上存在损耗,且同时处理大量视频时,可能会出现内存问题。
前端
前端的技术选择取决于我们要如何进行前端渲染
行业内一般有几种方式:
1、编辑内核在云端,即所有工作都要云端完成,那么前端能做得就比较少,可以有几种做法:
- 是后端处理完成后通过直播串流的方式推给前端,缺点:存在延迟的问题,体验不太好
- 前端只提供必要的预览,缺点:无法做到可见即可得
- 使用前端样式模拟效果,缺点:前后端很难做到一致的效果,而且一些效果没有办法很好的模拟
2、双核模式,即前后端分别都有一个渲染器,前端可以基于WebGL、Webassembly等方式来实现一个轻量级的编辑内核。
这样可以做到很好的实时预览效果,但是也存在缺点,前端即使做地再轻量化实现,也还是会依赖用户端的机器性能。而且由于平台的差异,最终的前后端的效果也可能不能做到完全一致。
行业内实现
B站云剪辑
采用双端渲染的模式,后端不确定是如何实现的,猜测使用ffmpeg,前端F12分析一下,目测是用的Webassembly+canvas渲染来实现实时预览的效果。前端渲染效果很快,特效、滤镜、文字几乎都是无延迟实时生效,可以实现多轨道编辑。
问题:有时会出现前端渲染错乱,但是实际生成后的视频效果正常的情况
veed
国外一个比较流行的在线视频编辑网站,经过了多次技术迭代与踩坑,最终使用的技术是双端渲染,云端使用ffmpeg + libavcodec,而前端则是使用WebGL + React来实现实时渲染。支持多轨道,且有大量的效果可选, 实际预览效果较好。
问题:实际使用中发现前端资源使用率较高,用起来比较卡。
爱奇艺
云端渲染,云端无法得知使用什么技术,前端则是通过canvas+多播放器组合的方式,来实现前端的实时预览效果。没有实际体验过,不知道效果如何。
阿里云智能剪辑
双端渲染,云端使用的阿里云自己的剪辑服务,前端提供SDK,也是使用Webassembly+canvas来实现实时预览效果。也支持多轨道,除了基础的字幕、贴纸、裁剪之类的功能,也同样提供了大量的滤镜和特效实现。
小结
可以发现,行业中云剪辑的主流实现方式,基本上都是使用前端Webassembly来实现实时预览 + 云端渲染成片的实现方式。更多的可能在于它优势远大于它的缺陷部分:
- 前端可以复用云端的功能实现逻辑,减少实现成本
- 前端可以预览几乎所有效果,同时预览效果和最终编辑效果差异也会更少,做到近乎一致的可见即可得
- Webassembly可以在浏览器上做到几乎和native相近的性能释放,前端体验更好
而它的问题在于,由于前端也需要做完整的渲染逻辑,那么也会受限于本地机器的性能限制,在机器性能较差时,在编辑及预览过程中,体验也会比较糟糕,没有办法利用到云端的资源。
PS:不过对于一些比较耗时的功能,比如转码、拼接或裁剪等功能,应该主要都是放在云端实现的,前端没有做实际的操作。
结论
考虑到性能及扩展性和稳定性,ffmpeg几乎没有缺点,经过各路大厂及时间的验证,C语言资源占用少,且强大的各种插件,且可以基于它的库进行二次开发,唯一的缺点在于学习成本。
前端跟着行业的脚步,不必要的坑不踩,使用前端渲染的方式,具体是WebGL还是Webassembly,考虑到实现的复杂性和可维护性,Webassembly更有优势。
因此可以考虑使用 后端ffmpeg + opencv(可选),前端Weassembly的实现方式。