1. 程式人生 > 實用技巧 >藍芽音樂之絕對音量

藍芽音樂之絕對音量

藍芽音樂之絕對音量

在這裡插入圖片描述

藍芽音樂播放中總是避免不了音量調節的操作,生活中最常見的場景就是手機連線藍芽耳機或音箱播放音樂,通過調節手機上的多媒體音量達到藍芽音樂音量調節的目的。這些功能是如何具體實現的,使用的技術的什麼,你感興趣嗎?本篇文章我們就來一探究竟。

藍芽音樂音量調節有如下兩種方法:

  1. 音訊資料增益
  2. 絕對音量控制

第一種方法是將手機端調節的多媒體音量大小,轉化為音訊資料的音量增益來間接達到控制音量,多見於安卓系統的裝置上,最終的音量大小為音訊資料音量增益和遠端裝置本身的音量設定共同作用的結果。下圖為播放藍芽音樂時手機上調節音量大小後,遠端裝置上接收到的音訊資料:
在這裡插入圖片描述

從音訊資料可以明顯看出,手機端調大多媒體音量,則藍芽裝置端接收到的音訊資料增益就變大,從而音樂音量變大;反之音樂音量變小。

第二種方法絕對音量控制音樂聲音大小就是本期的重點,通過絕對音量控制可以實現CT和TG兩端的音量設定同步改變,多見於IOS系統(預設採用藍芽絕對音量控制),安卓系統上該功能是預設關閉,需要主動進入開發人員選項中將藍芽絕對音量開關開啟:
在這裡插入圖片描述

藍芽絕對音量的實現離不開AVRCP協議,詳情參考《AVRCP_v1.6.2.pdf》。

絕對音量:Absolute volume,使CT和TG兩端的音量等級相同,允許CT端展示音量等級,該功能主要提供瞭如下兩個命令來處理音量

  1. SetAbsoluteVolume:設定絕對音量,音量變化的一方主動將音量等級設定到對方
  2. RegisterNotification:註冊音量變化的通知事件,來觀察音量變化,對方音量等級改變後通過監聽來改變本端的音量等級
    在這裡插入圖片描述

在安卓系統中這套絕對音量控制邏輯的執行完全依賴GT端(手機等中心裝置),即手機通過命令SetAbsoluteVolume設定當前的絕對音量值到裝置端,並且通過註冊通知音量事件監聽CT端的音量變化。

設定絕對音量的時序圖如下(註冊音量通知事件類似):
在這裡插入圖片描述

如上時序圖所示,第二次及之後的SetAbsoluteVolume指令就可以實現手機改變藍芽裝置音量大小的功能,那如何實現藍芽裝置反過來改變手機的音量大小呢?該功能的實現就依賴手機註冊的音量通知事件了,當裝置端改變音量後通過RegisterNotification response告知手機後,手機就會主動改變自身的音量值。

正好前段時間有位朋友向我諮詢瞭如下這個問題:

使用AvrcpControllerService 裡面的 PASS_THRU_CMD_ID_VOL_UPPASS_THRU_CMD_ID_VOL_DOWN 通過Pass Through命令傳送過去後,並不能實現機器控制手機音量的功能。

上述方法無效的主要原因在於手機端的藍芽服務接收到Pass Through命令後能夠成功解析出對應的 KeyEvent.KEYCODE_VOLUME_UPKeyEvent.KEYCODE_VOLUME_DOWN,並將指令傳送到安卓多媒體服務框架,但是這兩個指令值不是media有效的key值,所以手機這邊不會執行這兩個動作。
在這裡插入圖片描述

因此安卓系統上實現裝置端(CT)控制手機(GT)音量的功能可以使用手機向裝置控制器註冊音量通知的方式來完成。

感興趣的小夥伴歡迎私信留言一起討論,共同學習,一起進步!

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