藍牙電話之HFP-電話音頻

藍牙電話之HFP協議中的電話音頻

藍牙技術通信的內容多種多樣,其中音頻部分包含媒體音頻和電話音頻。

媒體音頻:播放藍牙音樂的數據,這種音頻對質量要求高,數據發送有重傳機制,從而以l2cap的數據形式走ACL鏈路。編碼方式有:SBC、AAC、APTX、APTX_HD、LDAC這五種編碼方式,最基礎的編碼方式是SBC,支持藍牙多媒體播放的設備必須支持該編碼方式,編碼質量最好的是LDAC。編碼方式的選取需要藍牙連接設備間的互相協商確定。

電話音頻:藍牙通話過程的語音數據,這種音頻對時效性有高要求,一般通過特殊的SCO或eSCO鏈路傳輸數據。編碼方式有:CVSD、mSBC。最基礎的編碼方式爲CVSD,免提藍牙設備都需支持該編碼方式,支持寬帶語音的設備可選mSBC編碼數據。
在這裏插入圖片描述

  • CVSD:該編碼方式的數據傳輸使用 SCO 或 eSCO 鏈路。鏈路的選取是根據本端 Controller是否支持 Enhanced Setup Synchronous Connection指令來決定的,如果支持該命令則創建語音音頻鏈路時使用 eSCO,否則創建 SCO 鏈路。
  • mSBC:該編碼方式的數據傳輸只能使用 eSCO 鏈路。

音頻鏈路 SCO 或 eSCO 創建成功後,藍牙系統會以 AUDIO_STATE_CHANGED 的廣播通知註冊過的應用,並且HF側的藍牙芯片會將接收到的語音數據通過PCM接口送入 audio 系統,那系統的 audio 模塊是如何操作避免多音源輸出呢 ?

這其實還是和藍牙電話應用密切相關的,藍牙電話收到音頻鏈路創建成功的廣播後通過AudioManager.requestAudioFocus() 申請到系統的音頻焦點後,audio 模塊會根據申請焦點的 stream type 判斷其級別,高級別的音源可以打斷低級別的音源(比如:聽音樂時打電話,會先暫停掉音樂)。藍牙電話還需要通過AudioManager.setMode() 接口通知 audio 底層打開通話通道,從而播放出通話語音。

藍牙電話一般還會有個電話靜音功能,開啓靜音功能後,本端可以聽到對方的語音,但對方聽不到本端的語音,這樣一個功能其實只需要將本端的收音設備給靜音掉就可實現。AudioManager.setMicrophoneMute() 設置 true,將 Mic 靜音。

由於藍牙電話語音的傳輸途徑爲:phone Audio -> PCM -> AG基帶 -> HF基帶 -> PCM -> Audio,以及反方向。那麼語音數據都是在底層傳輸的,上層基本涉及不到,從而開發藍牙電話時獲取語音數據就顯得尤爲困難,但方法也是有的。

  1. 在音頻數據傳輸的各個節點保存數據文件(如 PCM 輸入輸出),使用音頻分析軟件查看
  2. 藍牙抓包工具抓取通話的空口數據(如 Ellisys 或 Frontline 工具)

電話音頻的分析就先到這裏,後續有新的想法我會再更新相關文章的,感興趣的小夥伴歡迎私信留言一起討論。

更多互聯互通技術,歡迎關注微信公衆號:Connectivity
在這裏插入圖片描述

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