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

藍牙電話之HFP—電話音頻


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

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

藍牙設備交互


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


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

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

藍牙電話的編碼方式

  • 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,以及反方向。那麼語音數據都是在底層傳輸的,上層基本涉及不到,從而開發藍牙電話時獲取語音數據就顯得尤為困難,但方法也是有的。

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


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


分享到:


相關文章: