導(dǎo)讀:WebRTC 是一個非常優(yōu)秀的項(xiàng)目薯酝, 可以支持 Web、iOS爽柒、Android吴菠、Mac、Windows浩村、Linux 在內(nèi)的所有平臺的 API做葵,保證了 API 在所有平臺的一致性。然而 WebRTC 在移動端的表現(xiàn)跟 PC 相比心墅,顯得不是那么令人滿意酿矢,尤其是在 Android 系統(tǒng)上榨乎,Android 系統(tǒng)的自身碎片化已經(jīng)被詬病已久。每一次的 Android 系統(tǒng)升級瘫筐,每個芯片廠商蜜暑、手機(jī)廠商都會基于 Android 系統(tǒng)做一些定制化,造成了即使是同樣的 Android 系統(tǒng)版本策肝,同樣的 Android 標(biāo)準(zhǔn) API 調(diào)用肛捍,不同設(shè)備表現(xiàn)不一樣。所以如果不針對不同機(jī)型做適配之众,很難達(dá)到統(tǒng)一的用戶體驗(yàn)拙毫,功能的穩(wěn)定性也很難保證。
RTC 場景中要想在 Android 設(shè)備上實(shí)現(xiàn)高可靠棺禾、穩(wěn)定缀蹄、低延時、設(shè)備通用帘睦, 音視頻兼容性適配必不可少袍患。Android 設(shè)備相關(guān)參數(shù)精細(xì)化配置、智能化配置竣付,就是本文考慮的重心。
如何精細(xì)化配置
主流 SOC (System On Chip)方案都是基于 Linux/Android 系統(tǒng)開發(fā)滞欠,但是各家卻各有所長古胆。高通 SOC 主要應(yīng)用在手機(jī)設(shè)備上,編解碼性能和穩(wěn)定性都比較強(qiáng)大筛璧,視頻超編問題控制的比較好逸绎;MTK 和 MStar 并購后,除了手機(jī)產(chǎn)品夭谤,在機(jī)頂盒和大屏產(chǎn)品上應(yīng)用很廣棺牧,往往可以通過 MTK 自有參數(shù),開啟一些功能朗儒。此外不同的芯片版本計算性能高低不同颊乘,計算性能高低不同會影響音視頻功能的開啟,比如視頻的前后處理醉锄。目前主流的芯片方案如下圖:
基于上述不同的 SOC 平臺乏悄, 各類設(shè)備廠商會定制化不同的 Android 智能設(shè)備, 而每類設(shè)備的功能特點(diǎn)也不一樣恳不。
比如:
- Android phone:手機(jī)的電池耗電量要求相對嚴(yán)格檩小,設(shè)備需要滿足 360 角度旋轉(zhuǎn)的體驗(yàn)等;
- Android TV 大屏設(shè)備:
- 有些使用的是外接 camera烟勋;
- 在聲音采集場景中规求,人跟設(shè)備的距離往往比較遠(yuǎn)筐付,對高音質(zhì)音頻數(shù)據(jù)采集有挑戰(zhàn);
- Android Watch: 設(shè)備屏幕比較小阻肿,CPU 性能相對較弱等家妆;
手機(jī)設(shè)備是最常見的設(shè)備,也是用戶使用率非常高的設(shè)備冕茅。大部分手機(jī)制造商都針對 Android 系統(tǒng)做了定制化伤极,所以各家有各家的 ROM。手機(jī)廠商通常會對 Android 的 Framework姨伤、HAL 以及 Linux driver 做定制化修改哨坪,導(dǎo)致不同手機(jī)即使用同一款 SOC ,也會產(chǎn)生不同的表現(xiàn)乍楚。主流 Android 手機(jī)品牌及定制 ROM 如下圖:
所以根據(jù)上述分析当编,設(shè)備兼容性問題這么多,對于以音視頻為主要場景的產(chǎn)品徒溪,從音頻和視頻模塊都需要做到精細(xì)化兼容性適配忿偷。主要可以參考的配置參數(shù)可以包括(目前沒有全部都開啟可配置)如下的功能模塊:
- 音頻:基本功能、音效臊泌、音頻策略等
- 視頻:基本功能鲤桥、視頻前后處理等
詳細(xì)的參數(shù)如下圖:
如何智能化配置
對于音視頻的兼容性配置,需要滿足參數(shù)的可更改性渠概、時效性茶凳、靈活性、自動化以及可回退播揪。目前的 Android 參數(shù)下發(fā)配置方案可以分為以下四種:
下面贮喧,我們就針對這四點(diǎn)詳細(xì)展開聊聊,分析其優(yōu)缺點(diǎn)猪狈。
兼容性代碼 BuiltIn
兼容性方案是直接在代碼邏輯中做處理箱沦。這種方案,只能覆蓋一部分場景雇庙,比如針對不同 Android SDK 版本做兼容性適配以及已經(jīng)在測試中非常明確的配置谓形。
- 好處:直接寫在 SDK 中,不存在從服務(wù)端下發(fā)的情況状共,不占用網(wǎng)絡(luò)帶寬套耕,高效。
- 缺點(diǎn):但是對于線上出現(xiàn)問題的特殊機(jī)型峡继,往往設(shè)置不夠靈活冯袍。 當(dāng)線上的不同用戶,出現(xiàn)較多問題的情況時,需要通過更改 SDK 來解決問題康愤,這往往有種遠(yuǎn)水解不了近渴的感覺儡循。
本地文件配置
本地文件配置的方式是:通過讀取本地指定目錄下的配置文件來參數(shù)生效,往往在 SDK 初始化時即進(jìn)行這一步操作征冷。
- 好處:不需要重新打包 SDK择膝,可以直接將配置文件放到指定目錄即可將參數(shù)生效,也不需要到服務(wù)器修改下發(fā)參數(shù)即可生效检激。比較適合本地調(diào)參的場景肴捉。
- 缺點(diǎn):但是沒法解決線上客戶問題的遠(yuǎn)距離修改。
服務(wù)器參數(shù)下發(fā)
服務(wù)器下發(fā)參數(shù)設(shè)定叔收,可以隨時通過下發(fā)參數(shù)齿穗,控制設(shè)備相關(guān)功能參數(shù)。
- 好處:線上用戶遇到兼容性問題饺律,直接通過服務(wù)端下發(fā)參數(shù)修改窃页,可以幾分鐘內(nèi)解決用戶問題。
- 缺點(diǎn):通過服務(wù)器下發(fā)复濒,需要占用服務(wù)器資源脖卖,如果下發(fā)參數(shù)文件過大,會影響 SDK 初始化時間巧颈。
自動化策略選擇
參數(shù)的自動化策略選擇畦木,是通過對不同的系統(tǒng)版本、不同的 CPU 計算能力洛二、芯片平臺等因素進(jìn)行綜合考慮馋劈,對不同功能模塊的參數(shù)組合,形成幾套參數(shù)模版晾嘶,比如低性能要求參數(shù)模版,或者質(zhì)量優(yōu)先參數(shù)模版娶吞。當(dāng)不合適的參數(shù)設(shè)置導(dǎo)致問題時垒迂,有比較完善的回退機(jī)制可以回退到基本的參數(shù)配置,以保證基本功能可工作妒蛇。
兼容性適配的規(guī)則
以上兩章介紹了精細(xì)化配置的常見參數(shù)和智能化配置的方案机断, 那么不同設(shè)備型號、不同業(yè)務(wù)場景、不同系統(tǒng)版本,如何進(jìn)行區(qū)分官地?
下面畜晰,我們詳細(xì)介紹一下,制定兼容性適配規(guī)則的幾個維度饼齿。
根據(jù)單個設(shè)備適配
手機(jī)制造商基于新的 Android 系統(tǒng)做定制化的時候,很難做到完全一致漫仆,這種差異性在音視頻領(lǐng)域就更加泊碑。每個設(shè)備的唯一性坤按,可以根據(jù)設(shè)備的硬件制造商、主板馒过、設(shè)備版本臭脓、設(shè)備參數(shù)來標(biāo)識唯一性。
根據(jù)設(shè)備 CPU 適配
根據(jù) CPU 的計算能力進(jìn)行適配腹忽,通常為了適配一些對于計算性能要求比較高的功能来累,比如視頻前后處理等。選擇這種方式適配后窘奏,只要是同樣 CPU 型號的所有設(shè)備嘹锁,都能實(shí)現(xiàn)適配。
根據(jù)系統(tǒng)版本適配
每一次 Android 系統(tǒng)更新蔼夜, 會涉及到對應(yīng)音視頻 API 的相關(guān)功能改動兼耀。需要根據(jù) Android 系統(tǒng)版本號,進(jìn)行對應(yīng)的適配求冷。
根據(jù)不同應(yīng)用業(yè)務(wù)適配
不同的業(yè)務(wù)瘤运,對于音視頻的適配側(cè)重點(diǎn)不同。 比如多人會議場景匠题,對于音視頻的實(shí)時性拯坟、弱網(wǎng)下的穩(wěn)定性要求比較高,并且對于音頻降噪韭山,回音消除要求都比較高郁季;云游戲場景下,對視頻的分辨率钱磅、延遲度要求高梦裂;娛樂業(yè)務(wù)中的音樂播放,比如云音樂的一起聽功能盖淡,對音質(zhì)的要求比較高年柠,并且對于音頻設(shè)備路由策略上,有特殊要求褪迟,例如從藍(lán)牙播放音樂冗恨,但是從手機(jī) mic 采集音頻數(shù)據(jù);這些場景都要通過不同參數(shù)適配來達(dá)到要求味赃。
根據(jù) IOT 設(shè)備類型適配
Android 系統(tǒng)被應(yīng)用在各個 IOT 設(shè)備中掀抹,從而產(chǎn)生非常多的適配場景。比如電視大屏心俗,因?yàn)槠聊槐容^大傲武,所以要求視頻內(nèi)容是高分辨率、高幀率的,從而對于采集和編解碼的能力要求比較高谱轨;而且市場中存在一些可以 360 度旋轉(zhuǎn)的電視戒幔,需要在顯示角度上進(jìn)行適配;在大屏的音質(zhì)方面土童,由于人跟電視往往距離比較遠(yuǎn)诗茎,所以在聲音采集和回音消除上的處理跟手機(jī)又不太一樣。
兼容性適配常見的音視頻問題
我們下面來聊聊常見的音視頻兼容性適配的出現(xiàn)的問題献汗,其產(chǎn)生的原因以及我們時是如何解決的敢订。
音頻兼容性常見問題
音頻兼容性經(jīng)常會出現(xiàn)音質(zhì)、音量罢吃、音頻策略的問題楚午,下面我們選取其中幾種,簡單分析此類問題的解決方法尿招。
-
遇到問題:音頻延時過大或者延時不穩(wěn)定
- 解決方法:創(chuàng)建 Android 自采集的時候矾柜, AudioRecord 中設(shè)置的 Buffer 大小影響采集端延遲,從而影響AEC 算法精準(zhǔn)度就谜。
-
遇到問題:藍(lán)牙 A2DP 模式下怪蔑,從藍(lán)牙播放,但是卻無法從設(shè)備 mic 采集
- 解決方法:區(qū)分藍(lán)牙 SCO/A2DP 模式下丧荐,AudioSource缆瓣、AudioMode 的類型
-
遇到問題:發(fā)送端音量低
- 解決方案1:采集到的音頻數(shù)據(jù)源音量比較低,通過軟件 AGC 算法音量增強(qiáng)虹统;
- 解決方法2:修改 AudioSource弓坞,部分手機(jī)尤其老手機(jī),AudioSource.VOICE_COMMUNICATION 模式聲音偏低或者音頻通路處理有問題车荔;
-
遇到問題:音頻播放音質(zhì)偏低
- 解決方法:AudioTrack streamType 使用 AudioSystem.STREAM_MUSIC渡冻;
- 遇到問題:Audio 3A 相關(guān)參數(shù)(AEC AGC,ANS )忧便;現(xiàn)象是聲音忽大忽小菩帝,人聲抑制,背景噪音嚴(yán)重茬腿,音量過高或者過低
- 解決方法:通常是硬件 3A 和軟件算法 3A 的取長補(bǔ)短。
還有一些調(diào)用系統(tǒng) API freeze宜雀,使用 OpenSL ES 無法播放等問題切平,我們也探索了相應(yīng)的解決方案,在此不再贅述辐董。
視頻兼容性常見問題
視頻兼容性經(jīng)常會出現(xiàn)卡頓悴品、顯示畫面異常、編解碼失敗的問題,下面我們選取其中幾種苔严,簡單分析此類問題的解決方法定枷。
- 遇到問題:采集畫面有紅條:
解決方案:特定分辨率,幀率届氢,導(dǎo)致采集有紅色條紋
遇到問題:采集圖像黑:
解決方案:特定幀率欠窒,導(dǎo)致曝光問題。
遇到問題:偶現(xiàn)采集畫面割裂
解決方案:紋理采集格式導(dǎo)致
-
遇到問題:部分手機(jī) Camera2 采集有綠邊
- 解決方案:Camera2 不兼容
-
遇到問題:硬件編碼實(shí)際碼率跟編碼碼率相差大
- 解決方案:部分手機(jī)即使 Mediacodec 設(shè)置是 CBR退子, 碼率波動還是大
-
遇到問題:硬件編碼的碼流有黑邊后者綠邊:
- 解決方案:輸入數(shù)據(jù)的長和寬沒有按照 stride 對齊岖妄,編碼器無法進(jìn)行兼容
-
遇到問題:硬件解碼器無法創(chuàng)建:
- 解決方案1:設(shè)置給解碼器的 format 不對,比如顏色空間寂祥,編碼器名字荐虐,是否渲染到的 suface 等;
- 解決方案2:超出 SOC 所能支持的最高 decoder 個數(shù)丸凭;
還有一些調(diào)用系統(tǒng) API freeze福扬、MTK 芯片特殊問題處理,采集幀率不穩(wěn)定惜犀,解碼失敗等铛碑,我們也探索了相應(yīng)的解決方案,在此不再贅述向拆。
屏幕共享兼容性常見問題
屏幕共享是視頻采集中的特殊一種亚茬,也存在跟設(shè)備相關(guān)的一些問題。常見的有畫面卡住浓恳、采集數(shù)據(jù)有黑邊等問題刹缝,下面我們簡單分析此類問題的解決方法。
-
遇到問題:手機(jī)屏幕畫面處于靜止時颈将,采集幀率為0
- 解決方法:緩存一幀數(shù)據(jù)梢夯,定時發(fā)送
-
遇到問題:采集數(shù)據(jù)黑邊
- 解決方法:設(shè)置的分辨率與屏幕分辨率不匹配,系統(tǒng)會用黑色數(shù)據(jù)填充晴圾。更改采集分辨率颂砸。
結(jié)尾
網(wǎng)易云信音視頻 SDK 致力于為每一位用戶實(shí)現(xiàn)高清、穩(wěn)定死姚、易用人乓、低延時的服務(wù)。通過本文的介紹都毒,網(wǎng)易云信有很完善的兼容性適配方案色罚,來彌補(bǔ) Andriod 碎片化對用戶帶來的體驗(yàn)上的不足,同時也積累了非常多的兼容性適配經(jīng)驗(yàn)账劲,以滿足不同使用場景戳护,不同設(shè)備類型和型號帶來的各種奇形怪狀的問題金抡。
每一支設(shè)備的適配,都是匠人之心的傾注腌且;
每一步產(chǎn)品的研磨梗肝,都是精益求精的付出。
作者介紹
Iven铺董,網(wǎng)易資深 Android 音視頻開發(fā)工程師巫击,一直從事 Android 音視頻 SDK 功能開發(fā),期間負(fù)責(zé)網(wǎng)易云信的 G1 和 G2 的相關(guān)研發(fā)工作柄粹,同時也負(fù)責(zé)基于 Android 智能硬件的相關(guān)音視頻適配工作喘鸟,適配產(chǎn)品包括手機(jī)、電視驻右、手表什黑、機(jī)頂盒、智能音響等堪夭。