导读:WebRTC 是一个非常优秀的项目, 可以支持 Web、iOS、Android、Mac、Windows、Linux 在内的所有平台的 API,保证了 API 在所有平台的一致性。然而 WebRTC 在移动端的表现跟 PC 相比,显得不是那么令人满意,尤其是在 Android 系统上,Android 系统的自身碎片化已经被诟病已久。每一次的 Android 系统升级,每个芯片厂商、手机厂商都会基于 Android 系统做一些定制化,造成了即使是同样的 Android 系统版本,同样的 Android 标准 API 调用,不同设备表现不一样。所以如果不针对不同机型做适配,很难达到统一的用户体验,功能的稳定性也很难保证。

文|Iven

网易资深 Android 音视频开发工程师

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 如下图:

所以根据上述分析,设备兼容性问题这么多,对于以音视频为主要场景的产品,从音频和视频模块都需要做到精细化兼容性适配。主要可以参考的配置参数可以包括(目前没有全部都开启可配置)如下的功能模块:

  • 音频:基本功能、音效、音频策略等

  • 视频:基本功能、视频前后处理等

详细的参数如下图:

如何智能化配置

对于音视频的兼容性配置,需要满足参数的可更改性、时效性、灵活性、自动化以及可回退。目前的 Android 参数下发配置方案可以分为以下四种:

下面,我们就针对这四点详细展开聊聊,分析其优缺点。

 兼容性代码 Builtln 

兼容性方案是直接在代码逻辑中做处理。这种方案,只能覆盖一部分场景,比如针对不同 Android SDK 版本做兼容性适配以及已经在测试中非常明确的配置。

  • 好处:直接写在 SDK 中,不存在从服务端下发的情况,不占用网络带宽,高效。

  • 缺点:但是对于线上出现问题的特殊机型,往往设置不够灵活。当线上的不同用户,出现较多问题的情况时,需要通过更改 SDK 来解决问题,这往往有种远水解不了近渴的感觉。

 本地文件配置 

本地文件配置的方式是:通过读取本地指定目录下的配置文件来参数生效,往往在 SDK 初始化时即进行这一步操作。

  • 好处:不需要重新打包 SDK,可以直接将配置文件放到指定目录即可将参数生效,也不需要到服务器修改下发参数即可生效。比较适合本地调参的场景。

  • 缺点:但是没法解决线上客户问题的远距离修改。

 服务器参数下发 

服务器下发参数设定,可以随时通过下发参数,控制设备相关功能参数。

  • 好处:线上用户遇到兼容性问题,直接通过服务端下发参数修改,可以几分钟内解决用户问题。

  • 缺点:通过服务器下发,需要占用服务器资源,如果下发参数文件过大,会影响 SDK 初始化时间。

 自动化策略选择 

参数的自动化策略选择,是通过对不同的系统版本、不同的 CPU 计算能力、芯片平台等因素进行综合考虑,对不同功能模块的参数组合,形成几套参数模版,比如低性能要求参数模版,或者质量优先参数模版。当不合适的参数设置导致问题时,有比较完善的回退机制可以回退到基本的参数配置,以保证基本功能可工作。

兼容性适配的规则

以上两章介绍了精细化配置的常见参数和智能化配置的方案, 那么不同设备型号、不同业务场景、不同系统版本,如何进行区分?

下面,我们详细介绍一下,制定兼容性适配规则的几个维度。

 根据单个设备适配 

手机制造商基于新的 Android 系统做定制化的时候,很难做到完全一致,这种差异性在音视频领域就更加。每个设备的唯一性,可以根据设备的硬件制造商、主板、设备版本、设备参数来标识唯一性。

 根据设备 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 智能硬件的相关音视频适配工作,适配产品包括手机、电视、手表、机顶盒、智能音响等。

 延伸阅读 

  • 嘉宾PPT分享|泛娱乐领域音视频技术探索与实践

  • 技术干货 | iOS 高阶容器详解

  • 资讯|WebRTC M89 更新

技术实践 | Android 设备音视频兼容性适配相关推荐

  1. Android Q版本应用兼容性适配指导

    目录 Android Q版本应用兼容性适配指导... 1 1.      背景说明... 4 2.      存储空间限制... 4 2.1背景     4 2.2兼容性影响... 5 2.3 适配指 ...

  2. Android FFmpeg 音视频开发教程

    LearnFFmpeg 项目地址:githubhaohao/LearnFFmpeg 简介: Android FFmpeg 音视频开发教程 更多:作者   提 Bug 标签: An Android FF ...

  3. Android WebRTC 音视频开发总结(一)

    2014-03-03 13:51 by Blacker, 5464 阅读, 7 评论, 收藏, 编辑 接触Android WebRTC有一段时间了,现在将研究过程中的一些经验和知识总结出来,希望大家有 ...

  4. 如何做好 Android 端音视频测试?

    在用户眼中,优秀的音视频产品应该具有清晰.低延时.流畅.秒开.抗丢包.高音效等特征.为了满足用户以上要求,网易云信的工程师通过自建源站,在SDK端为了适应网络优化进行QoS优化,对视频编码器进行优化, ...

  5. 技术实践 | Android Flutter 多实例实践

    导读:Flutter CLI 工具支持将 Flutter Module 打包成 Android AAR 包以供外部依赖使用,即 Flutter AAR.在一个没有使用 Flutter 技术栈的 And ...

  6. Android前端音视频数据接入GB28181平台意义

    技术背景 在我们研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android或者Windows端,在没有国标IPC设备的前提下,模拟GB28181的信令和媒体流交 ...

  7. 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用

    疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...

  8. 【Web技术】1189- 你不知道的前端音视频知识

    Web 音视频的发展史 刀耕火种的年代--早期 HTML 在早期的 HTML,由于带宽.技术等各种因素限制,网页主要以简单的静态内容为主,只支持一些文字图片内容和简单的排版,不支持在线观看音视频. ( ...

  9. 【Web技术】1161- 你不知道的前端音视频知识

    Web 音视频的发展史 刀耕火种的年代--早期 HTML 在早期的 HTML,由于带宽.技术等各种因素限制,网页主要以简单的静态内容为主,只支持一些文字图片内容和简单的排版,不支持在线观看音视频. ( ...

最新文章

  1. 小编带你进入强如 Disruptor 也发生内存溢出?
  2. SAP MM PR单据类型的配置里‘Control’和’Doc.Type’字段的作用?
  3. Report_客制化Excel报表中的XLS标记(案例)
  4. c# 检查目录,当指定目录不存在时建立目录
  5. SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
  6. linq to xml 操作sitemap
  7. spring boot的多环境部署
  8. Ubuntu下如何正确安装FFmpeg
  9. 7-114 吉老师的回归 (15 分)
  10. 关于PHP的OpenSSL的加密问题
  11. c语言输入相应的成绩评定信息,C语言机练习题记答案.doc
  12. 添加Zabbix Agent客户端,并解决报错。
  13. 对付洗稿者的一个脑洞
  14. 数据库系统基础教程复习
  15. 小米与泰尔实验室联合发布《多模态技术白皮书》
  16. 基于jquery的web在线流程图设计器gooFlow
  17. excel在线_如何设计有趣又实用的在线课程
  18. 全国计算机城市排名,这五大城市教育资源全国领先,各城市优质高校排行榜一定要收藏!...
  19. 集成学习算法策略 Boosting和Bagging
  20. python 球的表面积和体积_[给球的体积算表面积]C语言求球的表面积和体积

热门文章

  1. mysql-四舍五入
  2. jQuery基础修炼圣典—DOM篇(二)jQuery遍历
  3. 去除右下角淘宝网弹窗恶意广告!
  4. SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
  5. 如何让VS根据编译环境选择相应的配置文件
  6. struts2+spring3+hibernate3整合(二)转载
  7. mantis1.18升级1.2X方法
  8. 如何读取FoxPro(dbf)打删除标记的记录
  9. Graphpad Prism 9绘制子列图与柱状图
  10. JetPack——网络库封装