背景
在多媒体领域,为给用户提供优质生动直观的便捷服务,从最早的图文场景已经发展为视频、直播的展现形式,以及目前热门的AR、VR应用。58集团旗下众多业务线,基本都有短视频应用的场景,比如安居客视频看房,车商通看车等,以更直观、便捷的视频形式为用户和商家提供服务。58短视频sdk作为通用的视频处理平台,需要在架构设计上全面考虑,帮助各个业务线聚焦于业务本身,根据业务场景,快速轻松实现短视频内容业务。
短视频APP的难点
短视频从流程上主要包括采集、处理、编码、封装、解码、渲染等。其中有很多技术点需要我们解决优化。
多媒体领域技术门槛高
音视频领域高门槛,音视频技术自身具有一定的技术门槛,需要具备一定的音频和视频处理基础,比如视频封装格式、音视频编解码器知识,以及理解掌握不同的音视频编码格式如opus、aac、h264,还有主流的开源框架ffmpeg等。
图形图像处理,对OpenGL 的运用掌握
对于移动端视频处理,当然离不开OpenGL,android的OpenGLES,iOS的GPUImage。对摄像头预览数据或者导入的数据进行处理,需要了解色彩空间的数据格式如RGB/YUV,以及它们之间的转换实现等,运用OpenGL完成渲染,添加各种特效、滤镜,包括图层混合,缩放、图像裁剪、旋转等。
适配性问题
短视频开发,会遇到很多机型适配问题,从摄像头的采集,android软硬编调用策略。而且要掌握不同平台的多媒体处理的API,不同机型和系统版本等都会带来兼容性问题。
高级功能实现成本问题
要实现视频编辑处理的高级功能如美颜、滤镜、特效、水印等,要考虑到开发成本、设计成本,并且这些高级功能对各方面技术要求也比较高。
性能问题
在终端实现复杂计算时要考虑到系统的支持能力,因此在进行媒体数据采集、渲染、编码等复杂计算时,要合理解决性能问题,考验开发的调优能力。
58短视频sdk为解决上面的难点,从架构上进行了详细考虑和设计,解决了业务线进行短视频相关内容业务开发中的难点问题,使业务线能够更聚焦于业务本身,根据业务场景,快速实现短视频功能。
58短视频架构
58短视频sdk从可扩展性和高模块化、高复用出发,对58短视频进行了整体架构设计。比如业务线可以灵活替换编解码库,对AR的支持等。
短视频sdk设计原则及目标
高模块化、高复用
模块化设计,保证每个模块动能独立、逻辑清晰;模块可插拔复用,减少重复代码,提高效率;同时高模块化可以促进高复用,如编码组件在视频录制、编辑、直播推流等都会复用到。
与UI、业务逻辑解耦
sdk的实现要隔离UI及业务层逻辑,这样接入方可自定义UI并实现自己的业务逻辑需求。
可扩展性
如sdk支持人脸识别,要考虑业务方若已经实现了人脸识别,并希望替换掉sdk的人脸识别,就要求sdk能够支持第三方库来实现。在录制及编辑过程中,提供数据回调接口支持业务线使用第三方库对数据进行滤镜、特效、贴纸等自定义需求实现。以及在架构设计上,要可扩展加入新的技术方案,如编解码库的替换,对AR的支持等。
自定义配置参数
在录制及编辑模块,可以配置分辨率、码率、帧率、编码格式等,后续也要支持配置滤镜的参数。
遵循上述的设计理念,短视频sdk在架构设计上重点关注模块化、组件化;所谓模块化是指提供一个完整的功能实现模块,如录制模块,其提供的功能就包括数据采集、处理、编码、合成整个流程;组件化是指将一个功能进行封装,这个功能的粒度比模块化更小、更独立,如视频数据采集组件、音频数据采集组件、硬编码组件等。封装实现了组件后,一个模块就由多个组件构成,加上接口层的回调、生命周期的控制等实现一整套完整的功能。
在进行组件封装的时候,要考虑功能粒度的划分,既要提供一个独立的功能,又不可以拆分的太细,要保证其完整的能力。模块化的设计实现上,要考虑其完整功能的各个流程,又要可动态依赖不同组件实现其灵活性,如录制模块,可以根据需要,在编码组件上,选择使用硬编码组件,或者软编码组件,或者同时使用这两种组件。
架构设计
短视频sdk从上到下分为业务层、包装层、模块层、组件层、核心层。其中业务层和包装层是对接入方开源的,可以通过这两层实现UI及业务逻辑。
58短视频sdk整体架构:
1. 业务层
该层就是业务方的实际项目,具体的使用,修改,由业务方完成。短视频sdk扩展性强、并支持二次开发,满足业务放的大部分需求。就比如你买来一台电脑,可能是用来玩游戏、可能是用来做服务器、也可能是用来做嵌入式物联网,多种需求均可满足。
2. 包装层
该层是短视频sdk对外提供的带基础界面交互的包装层,例如视频录制(recorderwrapper)、视频编辑(editorwrapper)、播放器(playerwrapper)。
该层是通过对模块层的包装,加入了界面交互和一定的业务逻辑,再通过MVP形式,对业务方提供。业务方可根据自身需求,或选择直接使用、或选择修改界面的表现形式、或选择修改业务逻辑。可以理解为我们提供了一台已经组装好,并且装好主机外科、配好外设、打上logo的一台电脑,业务方可自己修改电脑外观、更换外设、或是直接使用。
3. 模块层
该层主要是对外提供的完整视频功能,例如视频录制(recorder模块)、视频编辑(editor模块)、播放器(player模块)等等。
该层是通过对核心层的调用,对组件层的使用,再加入一些流程控制、生命周期、对外接口、回调等,完成一整套视频功能的模块层。可以理解为我们卖的一台已经组装好的电脑,线路已经梳理好,部分硬件已经安装完成,然后只需要使用方,根据自己的需求,选择一些可选的硬件(依赖注入)。
4. 组件层
该层主要是视频的基础组件,例如音视频的采集(capture模块)、视频编码(codec、软硬编模块等)、特效(timeline、action模块)等等。
该层是抽象出来的视频模块,是底层核心层的实现层,业务线可根据自身业务需求,选择不同的组件模块。可以理解为电脑的显卡、CPU、存储、电源等硬件。
5. 核心层
该层对应的模块为`core`模块,该模块内部提供接口、工具类、基础数据结构、项目内常量等。
该模块会被所有其他模块引用,是面向接口编程的基础。我们可以理解该模块就相当于主机的主板,提供各式各样的接口,具体插什么配件,完全由业务方选择。
短视频sdk架构设计的优势和应用效果
架构优势
通用性
短视频sdk从编解码到特效处理,都具有丰富的视频功能,可以支持不同业务线根据场景需要,定制化实现视频功能。
灵活性
对于接入方业务线,业务层、包装层是提供源码给业务线使用的,这两层与sdk的模块层、组件层是完全解耦的,业务线可根据需求定制业务场景,实现自己的业务封装和UI设计;模块化的设计,可以灵活选择合适的组件进行组装实现一个模块。
复用性
不同模块可复用一个组件,减少代码冗余,方便后续的维护、升级、修复组件问题等。
可扩展性
组件提供的功能是独立的,可升级或者替换一个组件,如增加支持h265编码的组件;可将AR运用到短视频sdk,提供AR组件,增加一个AR编辑模块等。短视频sdk具备高可扩展性,业务方可以根据实际需求选择集成。如录制模块调用的编码组件,只集成硬编码方式mediacodec,这样能有效的减少包体积并保证高性能,也可以为了兼容低系统的手机同时集成ffmpeg+x264和mediacodec,这样不受限于硬编码的系统要求,能够覆盖更多的手机提供给更多用户使用。
应用效果
未来架构的功能演进
组件化、模块化的设计,可使短视频sdk方便灵活的扩展新的组件及灵活组合选择需要的组件,也可以根据新支持的组件,封装出新的模块。基于这个架构设计,在未来sdk可以在以下方面扩展能力:
增加硬解码组件
增加AR组件
增加h265编解码组件
增加人脸识别组件
录制、编辑、推流模块扩展支持硬解码
可封装新的模块如AR录制模块,AR特效编辑模块,AR推流模块,也可以在原模块下支持AR相关的功能
当然,随着软硬件技术发展,还有很多未知、充满挑战、有趣的功能在等着我们。短视频sdk也在持续优化,以支持未来技术发展。
总结
本文主要介绍了短视频APP的技术难点以及58视频sdk架构设计。我们将持续丰富视频sdk的功能,保证其稳定性和高性能,致力于将短视频sdk打造成为一个通用的视频处理平台,集视频拍摄、编辑、处理合成等功能于一体,满足业务线各种可定制化的需求场景,让业务线可以快速、高效的集成使用,实现视频类产品需求的快速转化,更好的服务于用户。