Android平臺遠程聲音播放及采集方案

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 啟動主要做下面幾件事:

  1. 創(chuàng)建 AudioFlinger 和 AudioPolicyService。
  2. 解析 Audio Config 文件(audio_policy_configuration.xml),獲取支持的音頻外設列表及各輸入輸出通路詳細參數(shù)。
  3. 根據(jù)解析得到的外設列表,加載所有的 Audio HAL 庫。
  4. 為所有 output 設備打開 outputStream 并創(chuàng)建 PlaybackThread 線程。
  5. 為所有 input 設備打開 inputStream 并創(chuàng)建 RecordThread 線程。

2.3 AudioTrack 播放過程

Android 聲音播放都是通過 AudioTrack 進行,包括 MediaPlayer 最終也是創(chuàng)建 AudioTrack 來播放的。通過 AudioTrack 播放聲音主要包括下面幾步:

  1. 創(chuàng)建 AudioTrack。
  2. 調用 AudioTrack 的 play() 方法。
  3. 調用 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ù)流程跟播放恰好相反,這里不再贅述。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內(nèi)容

  • 1、電腦開機的那段時間所釋放出來的輻射值是最高的,所以按完開機鍵,請站起來走開,避免接受輻射。而在使用電腦的時候,...
    小杰_327a閱讀 336評論 0 0
  • 大掃除,規(guī)劃3月計劃與獎勵,還做了個美容,心情美美噠,三月,整裝待發(fā)(?>?<?)
    漫話時光閱讀 207評論 0 3
  • 第一步:先寫tableview兩個代理 UITableViewDataSource 和 UITableViewDe...
    張入銘閱讀 256評論 0 0
  • CSS浮動 首先了解兩個概念正常文檔流:將窗體自上而下分成一行一行。塊元素獨占一行;相鄰行內(nèi)元素在每行中按從左到右...
    belly_0閱讀 165評論 0 0
  • 著名作家蔣丹說過: "人來世上是個偶然,而走向死亡是個必 然。” 所以,只要我們活一天, 我們就應該用心去感悟生命...
    旖旎i閱讀 263評論 2 6