Android 裝置音影片相容性適配

Silkage發表於2021-04-29

  導讀: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 碎片化對使用者帶來的體驗上的不足,同時也積累了非常多的相容性適配經驗,以滿足不同使用場景,不同裝置型別和型號帶來的各種奇形怪狀的問題。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69999013/viewspace-2770469/,如需轉載,請註明出處,否則將追究法律責任。

相關文章