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

背景

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

相关推荐
RainbowSea1 天前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea1 天前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
考虑考虑1 天前
Jpa使用union all
java·spring boot·后端
用户3721574261351 天前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊1 天前
Java学习第22天 - 云原生与容器化
java
稻草人22221 天前
java Excel 导出 ,如何实现八倍效率优化,以及代码分层,方法封装
后端·架构
渣哥1 天前
原来 Java 里线程安全集合有这么多种
java
间彧1 天前
Spring Boot集成Spring Security完整指南
java
间彧1 天前
Spring Secutiy基本原理及工作流程
java
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构