當今這個音視頻無處不在的時代,音頻跟蹤會話ID(AudioTrack Session ID)是個很重要的參數,可以用來實現音頻相關的一些特效。接下來的內容我們就探究如何在安卓藍牙系統中獲取該id。
熟悉藍牙音樂播放流程的同學都瞭解藍牙音樂AVDTP的控制流與音頻流以及AVRCP是如何作用的,以如下的交互圖簡單介紹下:
AVDTP連接階段分爲四步:
1、 發現對端支持的編碼方式有哪幾種
2、 獲取每種編碼方式的參數
3、 雙方協商確定一個最優的編碼方式
4、 建立該編碼方式的AVDTP連接
音頻播放過程中只要創建的audiotrack不變則對應的session id就會保持不變。播放藍牙音樂也是這樣。那藍牙音樂對應的audiotrack
session id從哪兒獲取呢?
創建audiotrack都會生成對應的session id,那問題就簡單多了,藍牙音樂播放過程中audiotrack在哪兒被創建的?
藍牙音樂播放分爲source、sink兩端,source一般爲音頻流輸出端,sink接收音頻流方。這篇文章主要是已sink端來講解藍牙音頻播放流程。Sink方(藍牙耳機、音響、車載等)的藍牙芯片接收到音頻流後通過HCI送到藍牙協議棧,在協議棧中直接通過audio track送入安卓音頻系統播放音樂。
結合藍牙協議棧的代碼可以快速找到audio track的創建處爲:BtifAvrcpAudioTrackCreate(),通過sp<android::AudioTrack>
track可以實現session id的獲取。
那如何將該id送到application層呢?這塊就需要我們瞭解安卓藍牙系統中媒體音頻的架構,從而添加接口來獲取session id。
安卓系統中關於媒體音頻的架構類似於整個藍牙系統,見下圖:
根據上面的系統架構圖,則獲取audiotrack session id的接口主要和framework、service、JNI以及Bluedroid中btif都有關係。大概的時序圖如下:
至此audiotrack session id就通過新增接口被相關應用獲取。
更多互聯互通技術,歡迎關注微信公衆號:Connectivity