1. 遠程聲音播放方案簡介
目前終端常見的聲音輸出方式可以有喇叭、耳機、藍牙,并且具備聲音輸出通道自動切換能力,比如:連接藍牙耳機,聲音切到藍牙,喇叭靜音,斷開藍牙,聲音切回喇叭。本方案試著使用TCP/IP技術替代藍牙傳輸,實現(xiàn)一種類似于藍牙音樂的遠程聲音播放方案。
1.1 應用場景
比如:用戶觀看電視節(jié)目,當手機app連接電視,用戶選擇手機發(fā)聲,那么電視機的喇叭自動靜音,而將聲音轉到手機上輸出。
1.2 交互簡圖
2 現(xiàn)有 Android Audio 框架分析
2.1 Audio 架構
Android Audio 框架的核心在 AudioServer,AudioServer 主要由 AudioFlinger 和 AudioPolicyService 組成,其中 AudioFlinger 負責播放及錄制,AudioPolicyService 負責多外設之間的調度與切換。
每類音頻外設模塊(HW Module)會實現(xiàn)一份 Audio HAL,AudioServer 將處理后的音頻流發(fā)送至 Audio HAL,Audio HAL 再將音頻流轉發(fā)至對應的驅動或外設實現(xiàn)播放。聲音錄制流程則正好相反。
2.2 AudioServer 啟動過程
AudioServer 由 Linux init 進程啟動,AudioServer 啟動主要做下面幾件事:
- 創(chuàng)建 AudioFlinger 和 AudioPolicyService。
- 解析 Audio Config 文件(audio_policy_configuration.xml),獲取支持的音頻外設列表及各輸入輸出通路詳細參數(shù)。
- 根據(jù)解析得到的外設列表,加載所有的 Audio HAL 庫。
- 為所有 output 設備打開 outputStream 并創(chuàng)建 PlaybackThread 線程。
- 為所有 input 設備打開 inputStream 并創(chuàng)建 RecordThread 線程。
2.3 AudioTrack 播放過程
Android 聲音播放都是通過 AudioTrack 進行,包括 MediaPlayer 最終也是創(chuàng)建 AudioTrack 來播放的。通過 AudioTrack 播放聲音主要包括下面幾步:
- 創(chuàng)建 AudioTrack。
- 調用 AudioTrack 的 play() 方法。
- 調用 AudioTrack 的 write() 方法寫入音頻數(shù)據(jù)。
創(chuàng)建 AudioTrack 時重點是通過 AudioPolicyManager 分配了音頻路由通路,同時通知服務端 AudioFlinger 創(chuàng)建對應的 Track,用于接收音頻數(shù)據(jù)。
調用 play() 方法主要是將創(chuàng)建的 Track 加到 mActiveTracks 并激活沉睡的 PlaybackThread 線程。
調用 write() 方法通過共享內(nèi)存將數(shù)據(jù)寫入服務端 AudioFlinger,PlaybackThread 收到數(shù)據(jù)激活線程,將數(shù)據(jù)進行混音等處理再寫入對應的 Audio HAL,Audio HAL 再將數(shù)據(jù)寫入驅動或其它外設。
2.4 多 Audio 設備架構及調度
Android 平臺允許多種 Audio 設備共存,它們統(tǒng)一由 audio_policy_configuration.xml 配置文件進行描述,AudioServer 啟動時會解析此配置文件,并根據(jù)描述信息加載對應的 Audio HAL 庫,同時為每個輸出通路創(chuàng)建 PlaybackThread,為每個輸入通路創(chuàng)建 RecordThread 線程。
聲音播放時具體選擇由何通路輸出,由 AudioPolicyService 根據(jù)一系列路由策略來切換,例如:當藍牙耳機連接時,聲音切到藍牙通路輸出。當 USB 喇叭連接時,聲音切到 USB 通路輸出。
3 如何實現(xiàn)聲音遠程播放及采集
3.1 擴展 IP Sound 聲卡
根據(jù) Android 平臺的多 Audio 設備架構,我們可以輕松的擴展出任意 Audio 設備。
回到本方案,我們需要實現(xiàn)聲音遠程播放(包括局域網(wǎng)與廣域網(wǎng)),我們選定的通信方式為 TCP/IP 技術,數(shù)據(jù)通過 TCP/IP 傳輸不是本方案的關注重點,這里主要講如何將音頻數(shù)據(jù)截獲并通過 TCP/IP 轉發(fā)至遠程終端。
按照以下架構擴展名為 IP Sound Card 的聲卡,AudioPolicyService 增加新的策略用于切換到 IP Sound Card 通路,實現(xiàn) IP Sound Card HAL,HAL 中將收到音頻數(shù)據(jù),收到數(shù)據(jù)后通過提前建立好的 TCP/IP 連接發(fā)送到遠程終端。
3.2 遠程聲音采集
遠程聲音采集將遠程終端做為麥克風,實現(xiàn)遠程聲音錄制,其數(shù)據(jù)流程跟播放恰好相反,這里不再贅述。