深度解析!短视频如何成为现象级产品

欢迎你们前往 腾讯云+社区,获取更多腾讯海量技术实践干货哦~。

本文由 BestSDK 团队发布在腾讯云+社区算法


2016 年中国移动短视频用户数为 1.5 亿,今年预计会达到 2.4 亿,增加率高达 58.2%,可见短视频的热度在一直提高;近几年,短视频的生产模式在不断演进,从 UGC 到 PGC,再到最新的 MCN,内容的产能和质量均获得了巨大提高。多线程

短视频发展史

​图 1架构

图 1 所示是短视频及直播的发展史,众所周知,2016 年是直播元年,在这期间诞生了不少直播平台,好比熊猫、映客、斗鱼等;而在 2017 年,短视频的火爆程度并不亚于直播,可能你们都觉得短视频是从 2017 年开始火爆起来的,但其实早在 2015 年就已经诞生出快手、秒拍、美拍等短视频 App。ide

​图 2模块化

图 2 所示是短视频在各个行业的综合应用。性能

研发短视频 App 的难点

前面介绍完有关短视频的历史以及发展趋势,下面着重介绍一下关于短视频开发须要的预备知识及难点:优化

  • 一、音视频领域固有门槛编码

深入理解音视频编码格式 H.264 和 AAC 的编码细节;混音时如何将两个音频调整到一致的参数,使用什么样的算法去混合等等。线程

  • 二、图形图像、OpenGL 处理架构设计

摄像头预览数据,图像处理,音视频编解码都须要了解 RGB 和 YUV 色彩空间的数据格式,以及它们之间转换的方式等等。

  • 三、平台相关

要对相应平台的摄像头、麦克风、编解码、多媒体处理等 API 十分熟悉,不然它们的一些坑会耗费你大量时间。

  • 四、高级功能

视频编辑少不了特点和高级的功能,例如美颜,滤镜,MV 特效,倍数拍摄,文字特效等,每个高级功能都对各方面技术提出很高的要求。

  • 五、系统版本,机型等兼容性问题

这算是一个老生常谈的问题,不管 iOS 仍是 Android,机型和系统版本都愈来愈多了,必然会带来兼容性问题。好比会有小部分 Android 机型编码的视频在 iOS 端播放不了的状况,相似这种兼容性问题都是须要进行解决的。

  • 六、性能以及资源占用的优化

移动应用的计算资源受到相应系统的严格制约,在进行音视频采集,渲染,编码等复杂计算的同时,还要确保应用有足够的资源流畅运行,这要求开发人员有丰富的调优能力。

短视频 SDK 架构设计

接下来介绍一下咱们团队在进行短视频 SDK 实践中主要作的一些事情,这其中最重要的就是短视频 SDK 的架构设计,包括架构设计理念、架构图、总体数据流程、模块架构设计等。

  • 一、SDK 架构设计理念

​图 3

说到 SDK 的设计理念一定要提到命名规范,就跟七牛的企业理念「简单.可信赖」同样,咱们的命名规范是统1、简单而且精炼的,好比咱们将对外的核心类统一以 PLShortVideo 为前缀,如图 3 所示分别是录制、编辑以及剪辑等模块的命名;参数配置类则均以 PLxxxSetting 为标准进行命名(图 4);接口回调类则均以 PLxxxListener 为标准命名。

​图 4

第二点咱们遵循的是高模块化、模块可插拔的一个理念;高模块化必需要保证每一个类每一个方法都「名副其实」并「各司其职」,这样才能编写更清晰的逻辑;高模块化同时能够促进高复用,减小重复代码;图 5 所示是 SDK 内的转码核心类,由于编辑、剪辑在最后保存的时候都须要一个解码并从新编码的过程,在这里,转码核心类能够达到一个高复用。

​图 5

图 6​

图 6 所示为短视频 SDK 的包体划分,从表中咱们能够清晰地看到每一个包体的功能划分,不一样的功能放在了不一样的包体当中。咱们并无使用 ffmpeg 的软解软编,而是尽可能使用 Android 和 iOS 的系统 API 进行硬编硬解,这样不只减小了包体大小,并且速度要快不少,尽管在技术层面上会增长不少难度,会踩不少坑,但咱们仍是坚持选用这个方案。在引入第三方库时,咱们也都是会通过充分配置和裁剪去严格控制包体的大小,这样一来,全部包体总和才能有如今「小而精」(1.5M)的成果。表中最后的内置滤镜模块,其中的滤镜资源能够选择性拷贝,SDK 内部会自动判断。这是关于模块设计方面的一些理念。

​图 7

第三点是要和 UI 解耦,如图 7 所示,是从不一样 App 中截图获得的画面,能够看出每个App 都有各自的设计,做为一款短视频 SDK,是绝对不能够在 UI 方面限制客户发挥的。市面上有些短视频 SDK 将 UI 写死并做为 SDK 的一部分,这样对于客户在设计 UI 界面上来讲,是很是不友好的;咱们采用的是另外一种方法,SDK 与 UI 进行解耦,客户的 UI 是可自定义的,整个 SDK 中接受 view 的地方只有一处:

接着是扩展性这一块,咱们遵循高扩展,开放性的理念。在录制以及编辑过程当中,都会有数据的回调并支持第三方库进行美颜,滤镜,贴纸,特效等功能。

  • 二、短视频SDK架构

图 8​

图 8 所示为 Android 短视频 SDK 的架构图,能够划分为四层。第一层为应用层;第二层为 SDK 对外的接口层;第三层为核心层,主要是内部的一些模块;第四层主要是 Android 系统层。

​图 9

图 9 所示是总体数据流程图;输入模块支持经过两种方式采集数据,一种是经过摄像头和麦克风采集数据,采集到的数据能够进行数据处理,另外一种则是经过文件导入并进行解码处理;编辑模块有着十分丰富的功能好比添加字幕、MV 特效、添加背景音乐等等;编码模块主要支持 H.264 软编/硬编以及 ACC 软编/硬编。下面将着重就几个模块进行介绍。

​图 10

图 10 为录制模块的示意图。录制模块的重点在于帧数据获取,除了能够经过摄像头获取视频帧,还能够经过屏幕录制获取视频帧,而音频帧数据主要仍是经过麦克风进行获取;虚线部分的 Filter 模块主要实现了内置美颜/滤镜功能,另外由于有纹理和 YUV 数据的 CallBack 回调机制,因此也支持第三方库的美颜、滤镜、特效等功能;处理后的数据会通过 OpenGL 进行裁剪,缩放,旋转等操做,这些工做虽然能够由 CPU 来进行,可是会比较耗时,利用 GPU 是更明智的选择。

​图 11

图 11 所示为编辑模块的示意图。首先须要导入一个视频文件,解包以后会获得相应的帧数据,接着分别经过音视频解码器获得 PCM 和纹理,而后把它们送进编辑引擎,在这里面能够进行各类各样的处理数据通过编辑以后,与录制相同会分两路,其中一路进行播放渲染,另外一路会进行转码保存。

​图 12

图 12 所示是 MV 特效的实现思路。经过摄像头采集的数据无需解码,而 MV 视频文件的帧数据则须要解码后才能够进行处理。SurfaceTexture 的主要做用是将解码后的数据帧进行回调通知你能够在 OpenGL 线程中更新纹理了,这个通知能够是多线程同时进行的操做,因此在帧回调时必定要对其进行上锁,防止出现 MV 画面之间不一样步的问题。

图 13​

图 13 为日志系统的模块图。日志系统主要是为了方便排障,快速定位问题以及调试问题,咱们会将 SDK 版本、设备机型、系统版本,关键配置等一一进行输出,以方便用户根据这些信息进行排障。固然,研发过程不可能一路顺风,总要踩过一些坑才能使整个 SDK 更加完善。下面就列举一些咱们踩过的坑以及排查的过程。

部分视频剪辑出现花屏

咱们经过对客户提供的一些样本视频进行分析后,发现出问题的都是带有双向引用 B 帧的 High profile 视频,如图 14 所示,B 帧(3)位于中间,其引用左右两边的 P 帧(二、4)在显示时是这样的顺序,可是在进行帧存储以及视频解码时,B 帧(3)是在这 2 个 P 帧其后的。

最后给你们分享一句话,也算是对本身的一个鼓励,就是「Fake it until you make it」。对于咱们客户端团队,要将 SDK 打磨到最完美的状态咱们进行了不少尝试,也历经了不少血泪,最后才有今天的成果,咱们须要努力的地方也还有不少,也会再接再砺,谢谢你们!


问答

短视频的发展前景以及将来发展方向?

更多与短视频相关的精华问答,尽在腾讯云+社区!

相关阅读

快手为什么能成为现象级产品?还原2017年最火短视频背后的商业逻辑

开发手游和视频直播,这几款SDK必备

数据告诉你,抖音是怎么在半年以内逆袭的


此文已由做者受权腾讯云+社区发布,转载请注明文章出处

原文连接:https://cloud.tencent.com/developer/article/1049278

相关文章
相关标签/搜索