Android 設備音視頻兼容性適配

導讀: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 智能設備特點

比如:

  • Android phone:手機的電池耗電量要求相對嚴格,設備需要滿足 360 角度旋轉的體驗等;
  • Android TV 大屏設備:
    • 有些使用的是外接 camera;
  • 在聲音採集場景中,人跟設備的距離往往比較遠,對高音質音頻數據採集有挑戰;
  • Android Watch: 設備屏幕比較小,CPU 性能相對較弱等;

手機設備是最常見的設備,也是用戶使用率非常高的設備。大部分手機制造商都針對 Android 系統做了定製化,所以各家有各家的 ROM。手機廠商通常會對 Android 的 Framework、HAL 以及 Linux driver 做定製化修改,導致不同手機即使用同一款 SOC ,也會產生不同的表現。主流 Android 手機品牌及定製 ROM 如下圖:

主流 Android 手機品牌及定製 ROM

所以根據上述分析,設備兼容性問題這麼多,對於以音視頻爲主要場景的產品,從音頻和視頻模塊都需要做到精細化兼容性適配。主要可以參考的配置參數可以包括(目前沒有全部都開啓可配置)如下的功能模塊:

  • 音頻:基本功能、音效、音頻策略等
  • 視頻:基本功能、視頻前後處理等

詳細的參數如下圖:

設備詳細參數

如何智能化配置

對於音視頻的兼容性配置,需要滿足參數的可更改性、時效性、靈活性、自動化以及可回退。目前的 Android 參數下發配置方案可以分爲以下四種:

Android 參數下發配置方案

下面,我們就針對這四點詳細展開聊聊,分析其優缺點。

兼容性代碼 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 智能硬件的相關音視頻適配工作,適配產品包括手機、電視、手錶、機頂盒、智能音響等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章