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

背景

在我们的业务产品中,存在大量的音视频素材,都存在二次创作及编辑的需求,而传统的本地编辑器复杂难用,且无法跨平台编辑;第三方云编辑也存在各种限制。而音视频创作作为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的实现方式。

相关推荐
Dola_Pan33 分钟前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book35 分钟前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
蜗牛^^O^2 小时前
Docker和K8S
java·docker·kubernetes
从心归零2 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂3 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius4 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe4 小时前
分布式系统实战经验
java·分布式
canonical_entropy4 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
是梦终空4 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss4 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle