藍牙音樂之絕對音量
藍牙音樂播放中總是避免不了音量調節的操作,生活中最常見的場景就是手機連接藍牙耳機或音箱播放音樂,通過調節手機上的多媒體音量達到藍牙音樂音量調節的目的。這些功能是如何具體實現的,使用的技術的什麼,你感興趣嗎?本篇文章我們就來一探究竟。
藍牙音樂音量調節有如下兩種方法:
音頻數據增益絕對音量控制
第一種方法是將手機端調節的多媒體音量大小,轉化為音頻數據的音量增益來間接達到控制音量,多見於安卓系統的設備上,最終的音量大小為音頻數據音量增益和遠端設備本身的音量設置共同作用的結果。下圖為播放藍牙音樂時手機上調節音量大小後,遠端設備上接收到的音頻數據:
從音頻數據可以明顯看出,手機端調大多媒體音量,則藍牙設備端接收到的音頻數據增益就變大,從而音樂音量變大;反之音樂音量變小。
第二種方法絕對音量控制音樂聲音大小就是本期的重點,通過絕對音量控制可以實現CT和TG兩端的音量設置同步改變,多見於IOS系統(默認採用藍牙絕對音量控制),安卓系統上該功能是默認關閉,需要主動進入開發人員選項中將藍牙絕對音量開關打開:
藍牙絕對音量的實現離不開AVRCP協議,詳情參考《AVRCP_v1.6.2.pdf》。
絕對音量:Absolute volume,使CT和TG兩端的音量等級相同,允許CT端展示音量等級,該功能主要提供了如下兩個命令來處理音量
SetAbsoluteVolume:設置絕對音量,音量變化的一方主動將音量等級設置到對方RegisterNotification:註冊音量變化的通知事件,來觀察音量變化,對方音量等級改變後通過監聽來改變本端的音量等級
在安卓系統中這套絕對音量控制邏輯的運行完全依賴GT端(手機等中心設備),即手機通過命令SetAbsoluteVolume設置當前的絕對音量值到設備端,並且通過註冊通知音量事件監聽CT端的音量變化。
設置絕對音量的時序圖如下(註冊音量通知事件類似):
如上時序圖所示,第二次及之後的SetAbsoluteVolume指令就可以實現手機改變藍牙設備音量大小的功能,那如何實現藍牙設備反過來改變手機的音量大小呢?該功能的實現就依賴手機註冊的音量通知事件了,當設備端改變音量後通過RegisterNotification response告知手機後,手機就會主動改變自身的音量值。
正好前段時間有位朋友向我諮詢了如下這個問題:
使用 AvrcpControllerService 裡面的 PASS_THRU_CMD_ID_VOL_UP 和 PASS_THRU_CMD_ID_VOL_DOWN 通過 Pass Through 命令發送過去後,並不能實現機器控制手機音量的功能。
上述方法無效的主要原因在於手機端的藍牙服務接收到 Pass Through 命令後能夠成功解析出對應的 KeyEvent.KEYCODE_VOLUME_UP 和 KeyEvent.KEYCODE_VOLUME_DOWN,並將指令發送到安卓多媒體服務框架,但是這兩個指令值不是media有效的key值,所以手機這邊不會執行這兩個動作。
因此安卓系統上實現設備端(CT)控制手機(GT)音量的功能可以使用手機向設備控制器註冊音量通知的方式來完成。
感興趣的小夥伴歡迎私信留言一起討論,共同學習,一起進步!