蓝牙音乐播放中总是避免不了音量调节的操作,生活中最常见的场景就是手机连接蓝牙耳机或音箱播放音乐,通过调节手机上的多媒体音量达到蓝牙音乐音量调节的目的。这些功能是如何具体实现的,使用的技术的什么,你感兴趣吗?本篇文章我们就来一探究竟。
蓝牙音乐音量调节有如下两种方法:
- 音频数据增益
- 绝对音量控制
第一种方法是将手机端调节的多媒体音量大小,转化为音频数据的音量增益来间接达到控制音量,多见于安卓系统的设备上,最终的音量大小为音频数据音量增益和远端设备本身的音量设置共同作用的结果。下图为播放蓝牙音乐时手机上调节音量大小后,远端设备上接收到的音频数据:
从音频数据可以明显看出,手机端调大多媒体音量,则蓝牙设备端接收到的音频数据增益就变大,从而音乐音量变大;反之音乐音量变小。
第二种方法绝对音量控制音乐声音大小就是本期的重点,通过绝对音量控制可以实现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)音量的功能可以使用手机向设备控制器注册音量通知的方式来完成。
感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!