导读:WebRTC 是一个很是优秀的项目, 能够支持 Web、iOS、Android、Mac、Windows、Linux 在内的全部平台的 API,保证了 API 在全部平台的一致性。然而 WebRTC 在移动端的表现跟 PC 相比,显得不是那么使人满意,尤为是在 Android 系统上,Android 系统的自身碎片化已经被诟病已久。每一次的 Android 系统升级,每一个芯片厂商、手机厂商都会基于 Android 系统作一些定制化,形成了即便是一样的 Android 系统版本,一样的 Android 标准 API 调用,不一样设备表现不同。因此若是不针对不一样机型作适配,很难达到统一的用户体验,功能的稳定性也很难保证。算法
RTC 场景中要想在 Android 设备上实现高可靠、稳定、低延时、设备通用, 音视频兼容性适配必不可少。Android 设备相关参数精细化配置、智能化配置,就是本文考虑的重心。数组
如何精细化配置
主流 SOC (System On Chip)方案都是基于 Linux/Android 系统开发,可是各家却各有所长。高通 SOC 主要应用在手机设备上,编解码性能和稳定性都比较强大,视频超编问题控制的比较好;MTK 和 MStar 并购后,除了手机产品,在机顶盒和大屏产品上应用很广,每每能够经过 MTK 自有参数,开启一些功能。此外不一样的芯片版本计算性能高低不一样,计算性能高低不一样会影响音视频功能的开启,好比视频的先后处理。目前主流的芯片方案以下图:缓存
基于上述不一样的 SOC 平台, 各种设备厂商会定制化不一样的 Android 智能设备, 而每类设备的功能特色也不同。服务器
好比:网络
- Android phone:手机的电池耗电量要求相对严格,设备须要知足 360 角度旋转的体验等;
- Android TV 大屏设备:
- 有些使用的是外接 camera;
- 在声音采集场景中,人跟设备的距离每每比较远,对高音质音频数据采集有挑战;
- Android Watch: 设备屏幕比较小,CPU 性能相对较弱等;
手机设备是最多见的设备,也是用户使用率很是高的设备。大部分手机制造商都针对 Android 系统作了定制化,因此各家有各家的 ROM。手机厂商一般会对 Android 的 Framework、HAL 以及 Linux driver 作定制化修改,致使不一样手机即便用同一款 SOC ,也会产生不一样的表现。主流 Android 手机品牌及定制 ROM 以下图:ide
因此根据上述分析,设备兼容性问题这么多,对于以音视频为主要场景的产品,从音频和视频模块都须要作到精细化兼容性适配。主要能够参考的配置参数能够包括(目前没有所有都开启可配置)以下的功能模块:性能
- 音频:基本功能、音效、音频策略等
- 视频:基本功能、视频先后处理等
详细的参数以下图:测试
如何智能化配置
对于音视频的兼容性配置,须要知足参数的可更改性、时效性、灵活性、自动化以及可回退。目前的 Android 参数下发配置方案能够分为如下四种:ui
下面,咱们就针对这四点详细展开聊聊,分析其优缺点。编码
兼容性代码 BuiltIn
兼容性方案是直接在代码逻辑中作处理。这种方案,只能覆盖一部分场景,好比针对不一样 Android SDK 版本作兼容性适配以及已经在测试中很是明确的配置。
- 好处:直接写在 SDK 中,不存在从服务端下发的状况,不占用网络带宽,高效。
- 缺点:可是对于线上出现问题的特殊机型,每每设置不够灵活。 当线上的不一样用户,出现较多问题的状况时,须要经过更改 SDK 来解决问题,这每每有种远水解不了近渴的感受。
本地文件配置
本地文件配置的方式是:经过读取本地指定目录下的配置文件来参数生效,每每在 SDK 初始化时即进行这一步操做。
- 好处:不须要从新打包 SDK,能够直接将配置文件放到指定目录便可将参数生效,也不须要到服务器修改下发参数便可生效。比较适合本地调参的场景。
- 缺点:可是无法解决线上客户问题的远距离修改。
服务器参数下发
服务器下发参数设定,能够随时经过下发参数,控制设备相关功能参数。
- 好处:线上用户遇到兼容性问题,直接经过服务端下发参数修改,能够几分钟内解决用户问题。
- 缺点:经过服务器下发,须要占用服务器资源,若是下发参数文件过大,会影响 SDK 初始化时间。
自动化策略选择
参数的自动化策略选择,是经过对不一样的系统版本、不一样的 CPU 计算能力、芯片平台等因素进行综合考虑,对不一样功能模块的参数组合,造成几套参数模版,好比低性能要求参数模版,或者质量优先参数模版。当不合适的参数设置致使问题时,有比较完善的回退机制能够回退到基本的参数配置,以保证基本功能可工做。
兼容性适配的规则
以上两章介绍了精细化配置的常见参数和智能化配置的方案, 那么不一样设备型号、不一样业务场景、不一样系统版本,如何进行区分?
下面,咱们详细介绍一下,制定兼容性适配规则的几个维度。
根据单个设备适配
手机制造商基于新的 Android 系统作定制化的时候,很难作到彻底一致,这种差别性在音视频领域就更加。每一个设备的惟一性,能够根据设备的硬件制造商、主板、设备版本、设备参数来标识惟一性。
根据设备 CPU 适配
根据 CPU 的计算能力进行适配,一般为了适配一些对于计算性能要求比较高的功能,好比视频先后处理等。选择这种方式适配后,只要是一样 CPU 型号的全部设备,都能实现适配。
根据系统版本适配
每一次 Android 系统更新, 会涉及到对应音视频 API 的相关功能改动。须要根据 Android 系统版本号,进行对应的适配。
根据不一样应用业务适配
不一样的业务,对于音视频的适配侧重点不一样。 好比多人会议场景,对于音视频的实时性、弱网下的稳定性要求比较高,而且对于音频降噪,回音消除要求都比较高;云游戏场景下,对视频的分辨率、延迟度要求高;娱乐业务中的音乐播放,好比云音乐的一块儿听功能,对音质的要求比较高,而且对于音频设备路由策略上,有特殊要求,例如从蓝牙播放音乐,可是从手机 mic 采集音频数据;这些场景都要经过不一样参数适配来达到要求。
根据 IOT 设备类型适配
Android 系统被应用在各个 IOT 设备中,从而产生很是多的适配场景。好比电视大屏,由于屏幕比较大,因此要求视频内容是高分辨率、高帧率的,从而对于采集和编解码的能力要求比较高;并且市场中存在一些能够 360 度旋转的电视,须要在显示角度上进行适配;在大屏的音质方面,因为人跟电视每每距离比较远,因此在声音采集和回音消除上的处理跟手机又不太同样。
兼容性适配常见的音视频问题
咱们下面来聊聊常见的音视频兼容性适配的出现的问题,其产生的缘由以及咱们时是如何解决的。
音频兼容性常见问题
音频兼容性常常会出现音质、音量、音频策略的问题,下面咱们选取其中几种,简单分析此类问题的解决方法。
-
遇到问题:音频延时过大或者延时不稳定
- 解决方法:建立 Android 自采集的时候, AudioRecord 中设置的 Buffer 大小影响采集端延迟,从而影响AEC 算法精准度。
-
遇到问题:蓝牙 A2DP 模式下,从蓝牙播放,可是却没法从设备 mic 采集
- 解决方法:区分蓝牙 SCO/A2DP 模式下,AudioSource、AudioMode 的类型
-
遇到问题:发送端音量低
- 解决方案1:采集到的音频数据源音量比较低,经过软件 AGC 算法音量加强;
- 解决方法2:修改 AudioSource,部分手机尤为老手机,AudioSource.VOICE_COMMUNICATION 模式声音偏低或者音频通路处理有问题;
-
遇到问题:音频播放音质偏低
- 解决方法:AudioTrack streamType 使用 AudioSystem.STREAM_MUSIC;
- 遇到问题:Audio 3A 相关参数(AEC AGC,ANS );现象是声音忽大忽小,人声抑制,背景噪音严重,音量太高或者太低
- 解决方法:一般是硬件 3A 和软件算法 3A 的取长补短。
还有一些调用系统 API freeze,使用 OpenSL ES 没法播放等问题,咱们也探索了相应的解决方案,在此再也不赘述。
视频兼容性常见问题
视频兼容性常常会出现卡顿、显示画面异常、编解码失败的问题,下面咱们选取其中几种,简单分析此类问题的解决方法。
- 遇到问题:采集画面有红条:
-
解决方案:特定分辨率,帧率,致使采集有红色条纹
-
遇到问题:采集图像黑:
-
解决方案:特定帧率,致使曝光问题。
-
遇到问题:偶现采集画面割裂
-
解决方案:纹理采集格式致使
-
遇到问题:部分手机 Camera2 采集有绿边
- 解决方案:Camera2 不兼容
-
遇到问题:硬件编码实际码率跟编码码率相差大
- 解决方案:部分手机即便 Mediacodec 设置是 CBR, 码率波动仍是大
-
遇到问题:硬件编码的码流有黑边后者绿边:
- 解决方案:输入数据的长和宽没有按照 stride 对齐,编码器没法进行兼容
-
遇到问题:硬件解码器没法建立:
- 解决方案1:设置给解码器的 format 不对,好比颜色空间,编码器名字,是否渲染到的 suface 等;
- 解决方案2:超出 SOC 所能支持的最高 decoder 个数;
还有一些调用系统 API freeze、MTK 芯片特殊问题处理,采集帧率不稳定,解码失败等,咱们也探索了相应的解决方案,在此再也不赘述。
屏幕共享兼容性常见问题
屏幕共享是视频采集中的特殊一种,也存在跟设备相关的一些问题。常见的有画面卡住、采集数据有黑边等问题,下面咱们简单分析此类问题的解决方法。
-
遇到问题:手机屏幕画面处于静止时,采集帧率为0
- 解决方法:缓存一帧数据,定时发送
-
遇到问题:采集数据黑边
- 解决方法:设置的分辨率与屏幕分辨率不匹配,系统会用黑色数据填充。更改采集分辨率。
结尾
网易云信音视频 SDK 致力于为每一位用户实现高清、稳定、易用、低延时的服务。经过本文的介绍,网易云信有很完善的兼容性适配方案,来弥补 Andriod 碎片化对用户带来的体验上的不足,同时也积累了很是多的兼容性适配经验,以知足不一样使用场景,不一样设备类型和型号带来的各类奇形怪状的问题。
每一支设备的适配,都是匠人之心的倾注;
每一步产品的研磨,都是精益求精的付出。
做者介绍
Iven,网易资深 Android 音视频开发工程师,一直从事 Android 音视频 SDK 功能开发,期间负责网易云信的 G1 和 G2 的相关研发工做,同时也负责基于 Android 智能硬件的相关音视频适配工做,适配产品包括手机、电视、手表、机顶盒、智能音响等。