導讀: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 智能硬件的相關音視頻適配工做,適配產品包括手機、電視、手錶、機頂盒、智能音響等。