技术实践 | Android 设备音视频兼容性适配
導(dǎo)讀:WebRTC 是一個非常優(yōu)秀的項目, 可以支持 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)升級,每個芯片廠商、手機廠商都會基于 Android 系統(tǒng)做一些定制化,造成了即使是同樣的 Android 系統(tǒng)版本,同樣的 Android 標(biāo)準(zhǔn) API 調(diào)用,不同設(shè)備表現(xiàn)不一樣。所以如果不針對不同機型做適配,很難達(dá)到統(tǒng)一的用戶體驗,功能的穩(wěn)定性也很難保證。
文|Iven
網(wǎng)易資深 Android 音視頻開發(fā)工程師
RTC 場景中要想在 Android 設(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)用在手機設(shè)備上,編解碼性能和穩(wěn)定性都比較強大,視頻超編問題控制的比較好;MTK 和 MStar 并購后,除了手機產(chǎn)品,在機頂盒和大屏產(chǎn)品上應(yīng)用很廣,往往可以通過 MTK 自有參數(shù),開啟一些功能。此外不同的芯片版本計算性能高低不同,計算性能高低不同會影響音視頻功能的開啟,比如視頻的前后處理。目前主流的芯片方案如下圖:
基于上述不同的 SOC 平臺, 各類設(shè)備廠商會定制化不同的 Android 智能設(shè)備, 而每類設(shè)備的功能特點也不一樣。
比如:
Android Phone:手機的電池耗電量要求相對嚴(yán)格,設(shè)備需要滿足 360 角度旋轉(zhuǎn)的體驗等;
Android TV 大屏設(shè)備:
有些使用的是外接 camera;
在聲音采集場景中,人跟設(shè)備的距離往往比較遠(yuǎn),對高音質(zhì)音頻數(shù)據(jù)采集有挑戰(zhàn);
Android Watch:設(shè)備屏幕比較小,CPU 性能相對較弱等;
手機設(shè)備是最常見的設(shè)備,也是用戶使用率非常高的設(shè)備。大部分手機制造商都針對 Android 系統(tǒng)做了定制化,所以各家有各家的 ROM。手機廠商通常會對 Android 的 Framework、HAL 以及 Linux driver 做定制化修改,導(dǎo)致不同手機即使用同一款 SOC ,也會產(chǎn)生不同的表現(xiàn)。主流 Android 手機品牌及定制 ROM 如下圖:
所以根據(jù)上述分析,設(shè)備兼容性問題這么多,對于以音視頻為主要場景的產(chǎn)品,從音頻和視頻模塊都需要做到精細(xì)化兼容性適配。主要可以參考的配置參數(shù)可以包括(目前沒有全部都開啟可配置)如下的功能模塊:
音頻:基本功能、音效、音頻策略等
視頻:基本功能、視頻前后處理等
詳細(xì)的參數(shù)如下圖:
如何智能化配置
對于音視頻的兼容性配置,需要滿足參數(shù)的可更改性、時效性、靈活性、自動化以及可回退。目前的 Android 參數(shù)下發(fā)配置方案可以分為以下四種:
下面,我們就針對這四點詳細(xì)展開聊聊,分析其優(yōu)缺點。
?兼容性代碼 Builtln?
兼容性方案是直接在代碼邏輯中做處理。這種方案,只能覆蓋一部分場景,比如針對不同 Android SDK 版本做兼容性適配以及已經(jīng)在測試中非常明確的配置。
好處:直接寫在 SDK 中,不存在從服務(wù)端下發(fā)的情況,不占用網(wǎng)絡(luò)帶寬,高效。
缺點:但是對于線上出現(xiàn)問題的特殊機型,往往設(shè)置不夠靈活。當(dāng)線上的不同用戶,出現(xiàn)較多問題的情況時,需要通過更改 SDK 來解決問題,這往往有種遠(yuǎn)水解不了近渴的感覺。
?本地文件配置?
本地文件配置的方式是:通過讀取本地指定目錄下的配置文件來參數(shù)生效,往往在 SDK 初始化時即進(jìn)行這一步操作。
好處:不需要重新打包 SDK,可以直接將配置文件放到指定目錄即可將參數(shù)生效,也不需要到服務(wù)器修改下發(fā)參數(shù)即可生效。比較適合本地調(diào)參的場景。
缺點:但是沒法解決線上客戶問題的遠(yuǎn)距離修改。
?服務(wù)器參數(shù)下發(fā)?
服務(wù)器下發(fā)參數(shù)設(shè)定,可以隨時通過下發(fā)參數(shù),控制設(shè)備相關(guān)功能參數(shù)。
好處:線上用戶遇到兼容性問題,直接通過服務(wù)端下發(fā)參數(shù)修改,可以幾分鐘內(nèi)解決用戶問題。
缺點:通過服務(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)致問題時,有比較完善的回退機制可以回退到基本的參數(shù)配置,以保證基本功能可工作。
兼容性適配的規(guī)則
以上兩章介紹了精細(xì)化配置的常見參數(shù)和智能化配置的方案, 那么不同設(shè)備型號、不同業(yè)務(wù)場景、不同系統(tǒng)版本,如何進(jìn)行區(qū)分?
下面,我們詳細(xì)介紹一下,制定兼容性適配規(guī)則的幾個維度。
?根據(jù)單個設(shè)備適配?
手機制造商基于新的 Android 系統(tǒng)做定制化的時候,很難做到完全一致,這種差異性在音視頻領(lǐng)域就更加。每個設(shè)備的唯一性,可以根據(jù)設(shè)備的硬件制造商、主板、設(shè)備版本、設(shè)備參數(shù)來標(biāo)識唯一性。
?根據(jù)設(shè)備 CPU 適配?
每一次 Android 系統(tǒng)更新, 會涉及到對應(yīng)音視頻 API 的相關(guān)功能改動。需要根據(jù) Android 系統(tǒng)版本號,進(jìn)行對應(yīng)的適配。
?根據(jù)不同應(yīng)用業(yè)務(wù)適配?
不同的業(yè)務(wù),對于音視頻的適配側(cè)重點不同。比如多人會議場景,對于音視頻的實時性、弱網(wǎng)下的穩(wěn)定性要求比較高,并且對于音頻降噪,回音消除要求都比較高;云游戲場景下,對視頻的分辨率、延遲度要求高;娛樂業(yè)務(wù)中的音樂播放,比如云音樂的一起聽功能,對音質(zhì)的要求比較高,并且對于音頻設(shè)備路由策略上,有特殊要求,例如從藍(lán)牙播放音樂,但是從手機 mic 采集音頻數(shù)據(jù);這些場景都要通過不同參數(shù)適配來達(dá)到要求。
?根據(jù) IOT 設(shè)備類型適配?
Android 系統(tǒng)被應(yīng)用在各個 ?IOT 設(shè)備中,從而產(chǎn)生非常多的適配場景。比如電視大屏,因為屏幕比較大,所以要求視頻內(nèi)容是高分辨率、高幀率的,從而對于采集和編解碼的能力要求比較高;而且市場中存在一些可以 360 度旋轉(zhuǎn)的電視,需要在顯示角度上進(jìn)行適配;在大屏的音質(zhì)方面,由于人跟電視往往距離比較遠(yuǎn),所以在聲音采集和回音消除上的處理跟手機又不太一樣。
兼容性適配常見的音視頻問題
我們下面來聊聊常見的音視頻兼容性適配的出現(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 算法音量增強。
解決方法2:修改 AudioSource,部分手機尤其老手機,AudioSource.VOICE_COMMUNICATION 模式聲音偏低或者音頻通路處理有問題。
遇到問題:音頻播放音質(zhì)偏低
解決方法:AudioTrack streamType 使用 AudioSystem.STREAM_MUSIC。
遇到問題:Audio 3A 相關(guān)參數(shù)(AEC AGC,ANS );現(xiàn)象是聲音忽大忽小,人聲抑制,背景噪音嚴(yán)重,音量過高或者過低
解決方法:通常是硬件 3A 和軟件算法 3A 的取長補短。
還有一些調(diào)用系統(tǒng) API freeze,使用 OpenSL ES 無法播放等問題,我們也探索了相應(yīng)的解決方案,在此不再贅述。
?視頻兼容性常見問題?
視頻兼容性經(jīng)常會出現(xiàn)卡頓、顯示畫面異常、編解碼失敗的問題,下面我們選取其中幾種,簡單分析此類問題的解決方法。
遇到問題:采集畫面有紅條:
解決方案:特定分辨率,幀率,導(dǎo)致采集有紅色條紋
遇到問題:采集圖像黑:
解決方案:特定幀率,導(dǎo)致曝光問題。
遇到問題:偶現(xiàn)采集畫面割裂
解決方案:紋理采集格式導(dǎo)致
遇到問題:部分手機 Camera2 采集有綠邊
解決方案:Camera2 不兼容
遇到問題:硬件編碼實際碼率跟編碼碼率相差大
解決方案:部分手機即使 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ù)有黑邊等問題,下面我們簡單分析此類問題的解決方法。
遇到問題:手機屏幕畫面處于靜止時,采集幀率為0
解決方法:緩存一幀數(shù)據(jù),定時發(fā)送
遇到問題:采集數(shù)據(jù)黑邊
解決方法:設(shè)置的分辨率與屏幕分辨率不匹配,系統(tǒng)會用黑色數(shù)據(jù)填充,可以通過更改采集分辨率的方式解決
總結(jié)
網(wǎng)易云信音視頻 SDK 致力于為每一位用戶實現(xiàn)高清、穩(wěn)定、易用、低延時的服務(wù)。通過本文的介紹,網(wǎng)易云信有很完善的兼容性適配方案,來彌補 Andriod 碎片化對用戶帶來的體驗上的不足,同時也積累了非常多的兼容性適配經(jīng)驗,以滿足不同使用場景,不同設(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)品包括手機、電視、手表、機頂盒、智能音響等。
?延伸閱讀?
嘉賓PPT分享|泛娛樂領(lǐng)域音視頻技術(shù)探索與實踐
技術(shù)干貨 | iOS 高階容器詳解
資訊|WebRTC M89 更新
總結(jié)
以上是生活随笔為你收集整理的技术实践 | Android 设备音视频兼容性适配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嘉宾PPT分享|泛娱乐领域音视频技术探索
- 下一篇: 娱乐社交,玩票大的!2021网易云信“融