一些对于在线音视频编辑选型的思考

背景

在我们的业务产品中,存在大量的音视频素材,都存在二次创作及编辑的需求,而传统的本地编辑器复杂难用,且无法跨平台编辑;第三方云编辑也存在各种限制。而音视频创作作为5G时代的主流内容,我们也可以在这个方向进行技术以储备及发展。

基本功能

  • 素材管理、编辑

  • 视频裁剪、合并

  • 多种格式的导入、导出与转换

  • 嵌入字母及编辑

  • 多轨道管理:多轨编辑、分离、新增

  • 素材效果

  • 人脸识别、特效

  • 直播实时编辑

云编辑如果需要不受限于本地机器性能,那么视频编辑的主要工作肯定需要在后端写完成,那么就需要考虑几个问题:

  • 前端如何实时预览

  • 所见即所得,怎么保证预览效果和后端生成效果一致

  • 前端编辑性能

技术选型

后端选型

ffmpeg

ffmpeg不多说,如果是个开发人员,可能没有用过,但是应该至少听过,它是一个完整的跨平台解决方案,用于记录,转换和流式传输音频和视频,是视频/音频处理最常用的开源软件。市面上大部分的音视频播放器、剪辑软件,都是基于它实现的。

优点:

功能强大且灵活。几乎可以满足所有的剪辑需求

缺点:

使用C语言开发,如果基于ffmpeg实现,前期可以直接调用编译好的命令行实现基本功能,但是后期肯定是需要基于它的共享库做二次开发。学习成本及维护成本比较高

opencv

opencv虽然底层也用了ffmpeg,但是音视频剪辑不是它的主要方向,它更多的是用来做图像处理,比如对视频做特效:人脸识别、抠图换景、算法贴图等

优势:

强大的图像处理功能,支持与计算机视觉和机器学习有关的多种算法,可以实现各种你想要的图像、视频效果。而且由于它底层也用了ffmpeg和libavcodec,所以即使它并不是主要用于视频编辑,但也可以实现相关的功能。

缺点:

学习成本非常高,且它的性能会比直接用ffmpeg要稍差一些。

moviePy

MoviePy是一个用于视频编辑的Python模块,它可被用于一些基本操作(如剪切、拼接、插入标题)、视频合成(即非线性编辑)、视频处理和创建高级特效。它底层实际上也是调用ffmpeg来处理视频编辑,opencv和其它一些库来实现高级的图片处理。

优点:

上手十分简单,代码简单易懂

缺点:

相比于直接使用ffmpeg、opencv等,性能上存在损耗,且同时处理大量视频时,可能会出现内存问题。

前端

前端的技术选择取决于我们要如何进行前端渲染

行业内一般有几种方式:

1、编辑内核在云端,即所有工作都要云端完成,那么前端能做得就比较少,可以有几种做法:

  1. 是后端处理完成后通过直播串流的方式推给前端,缺点:存在延迟的问题,体验不太好
  2. 前端只提供必要的预览,缺点:无法做到可见即可得
  3. 使用前端样式模拟效果,缺点:前后端很难做到一致的效果,而且一些效果没有办法很好的模拟

2、双核模式,即前后端分别都有一个渲染器,前端可以基于WebGL、Webassembly等方式来实现一个轻量级的编辑内核。

这样可以做到很好的实时预览效果,但是也存在缺点,前端即使做地再轻量化实现,也还是会依赖用户端的机器性能。而且由于平台的差异,最终的前后端的效果也可能不能做到完全一致。

行业内实现

B站云剪辑

采用双端渲染的模式,后端不确定是如何实现的,猜测使用ffmpeg,前端F12分析一下,目测是用的Webassembly+canvas渲染来实现实时预览的效果。前端渲染效果很快,特效、滤镜、文字几乎都是无延迟实时生效,可以实现多轨道编辑。

问题:有时会出现前端渲染错乱,但是实际生成后的视频效果正常的情况

veed

国外一个比较流行的在线视频编辑网站,经过了多次技术迭代与踩坑,最终使用的技术是双端渲染,云端使用ffmpeg + libavcodec,而前端则是使用WebGL + React来实现实时渲染。支持多轨道,且有大量的效果可选, 实际预览效果较好。

问题:实际使用中发现前端资源使用率较高,用起来比较卡。

爱奇艺

云端渲染,云端无法得知使用什么技术,前端则是通过canvas+多播放器组合的方式,来实现前端的实时预览效果。没有实际体验过,不知道效果如何。

阿里云智能剪辑

双端渲染,云端使用的阿里云自己的剪辑服务,前端提供SDK,也是使用Webassembly+canvas来实现实时预览效果。也支持多轨道,除了基础的字幕、贴纸、裁剪之类的功能,也同样提供了大量的滤镜和特效实现。

小结

可以发现,行业中云剪辑的主流实现方式,基本上都是使用前端Webassembly来实现实时预览 + 云端渲染成片的实现方式。更多的可能在于它优势远大于它的缺陷部分:

  1. 前端可以复用云端的功能实现逻辑,减少实现成本
  2. 前端可以预览几乎所有效果,同时预览效果和最终编辑效果差异也会更少,做到近乎一致的可见即可得
  3. Webassembly可以在浏览器上做到几乎和native相近的性能释放,前端体验更好

而它的问题在于,由于前端也需要做完整的渲染逻辑,那么也会受限于本地机器的性能限制,在机器性能较差时,在编辑及预览过程中,体验也会比较糟糕,没有办法利用到云端的资源。

PS:不过对于一些比较耗时的功能,比如转码、拼接或裁剪等功能,应该主要都是放在云端实现的,前端没有做实际的操作。

结论

考虑到性能及扩展性和稳定性,ffmpeg几乎没有缺点,经过各路大厂及时间的验证,C语言资源占用少,且强大的各种插件,且可以基于它的库进行二次开发,唯一的缺点在于学习成本。

前端跟着行业的脚步,不必要的坑不踩,使用前端渲染的方式,具体是WebGL还是Webassembly,考虑到实现的复杂性和可维护性,Webassembly更有优势。

因此可以考虑使用 后端ffmpeg + opencv(可选),前端Weassembly的实现方式。

相关推荐
爬山算法13 分钟前
Maven(28)如何使用Maven进行依赖解析?
java·maven
2401_8574396937 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66639 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索41 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨1 小时前
Filter和Listener
java·filter
qq_4924484461 小时前
Java实现App自动化(Appium Demo)
java
洛卡卡了1 小时前
从单层到 MVC,再到 DDD:架构演进的思考与实践
架构·mvc
阿华的代码王国1 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
找了一圈尾巴2 小时前
前后端交互通用排序策略
java·交互
乌恩大侠2 小时前
O-RAN Fronthual CU/Sync/Mgmt 平面和协议栈
5g·平面·fpga开发·架构