AVRCP Spec下载: A/V Remote Control Profile | Bluetooth® Technology Website
扩展阅读:
蓝牙AVRCP协议分析_蓝牙avrcp版本是越高越好吗-优快云博客
蓝牙音乐中不单单涉到A2DP,对A2DP还不了解的可以查看这篇文章: 蓝牙音乐之A2DP协议 - 知乎
还有音乐远端控制功能(播放,暂停,切换歌曲等),歌曲信息,音量同步,专辑封面而这些功能的实现都依赖于AVRCP协议。
AVRCP:Audio/VideoRemote Control Profile,音视频远端控制协议,所以该协议不但能控制蓝牙音乐,也可以控制视频流相应的功能。常见的使用到AVRCP控制功能的场景有如下几种:
- 耳机或车载等蓝牙设备控制其他设备上的音乐音源播放(手机)
- 远端设备控制其他设备上的视频播放
- 远端设备控制手机拍照(手机前台应用为照相机)
AVRCP协议版本变化,版本之间都是向下兼容的关系:
- v1.0:基本的远程控制命令,如播放、暂停、切歌
- v1.3:新增获取音乐当前的播放状态以及播放音乐的歌曲信息(歌曲总时长、当前播放位置、歌曲名、专辑名、歌手)
- v1.4:新增浏览功能,支持绝对音量调节
- v1.5:相关协议已通过的更改以纠正各种错误
- v1.6:新增两个特性:
- 项目的数量,用于控制器的接口,请求和接收文件夹中的项数,而无需下载列表
- 封面艺术,支持通过基于 OBEX 协议上的BIP(Basic Imaging Profile)协议将图像传输到媒体项目
所以如果两端设备的AVRCP协议都支持1.6及以上,则可实现通过蓝牙传输图片的功能。由于蓝牙传输数据量的限制,该功能也只是适用于音乐专辑封面照等小数据量的传输,而不适合大批量图片的传输。
最新的v1.6版本的AVRCP协议结构及依赖关系如下:
AVRCP依赖于GAP,对于封面艺术功能,AVRCP使用通用成像图像BIP的特征
AVRCP协议的核心概况如下:
Baseband、LMP和L2CAP是OSI第1层和第2层蓝牙协议,SDP是蓝牙服务发现协议,OBEX是底层传输BIP的协议,它是提供与媒体相关的图像交换功能的实体。AV/C是负责基于AV/C命令的设备控制信令的实体。应用程序是AVRCP实体,交换控制和浏览本规范中定义的命令。
类似其他蓝牙协议,AVRCP协议也将设备两端划分为两种角色:
- CT:controller控制器是通过向目标设备发送命令帧来启动事务的设备,如耳机、音箱、车载蓝牙设备
- TG:target目标是接收控制器发送过来的命令帧并生成相应响应帧的设备,如手机
需要注意的是,通常情况下CT和TG都是成对出现在同一个piconet网中,但是同一个piconet网中可以存在多个CT设备,比如同一个手机(TG)可以同时连接多个耳机(CT)。耳机控制手机的上一首下一首,耳机做CT,手机做TG。常见的关系图如下:
从上面的概况图可知AVRCP协议的传输依赖于AVCTP,所以AVRCP协议的连接、交互实际上是AVCTP传输协议的连接、交互流程。
AVCTP的连接建立
用于AVCTP控制的L2CAP链路的连接建立可以由CT或TG启动,此L2CAP链路称为控制通道。如果设备双方都支持浏览功能(AVRCP版本都在v1.4及以上),则还可以在控制通道建立后再建立一条浏览通道,浏览通道在建立时应配置为使用L2CAP增强重传模式。同理通道的释放也可以由CT或TG启动,如果存在浏览通道则需要在控制通道断开前释放。
如果两端设备同时打开AVCTP通道建立连接,双方检测到连接冲突后两个通道都应关闭,每端设备应该等待随机时间 (100ms <= time <= 1s),然后再尝试打开AVCTP通道。如果知道哪个设备是主设备,则该设备可以立即重新尝试连接。
实际使用过程中AVCTP的连接都会在AVDTP(A2DP协议依赖的传输协议)连接成功后由CT端设备主动发起连接,当然TG端设备可选择性的也发起主动连接。
AVRCP中基本AV/C命令
AV/C命令启动的前提是AVCTP的连接已建立,这样由用户触发或程序内部启动的AV/C流程才可正常运作,大致流程图如下:
OBEX的连接和断开
AVRCP(v1.6版本及以上)使用来自BIP协议通用成像图像特性中定义的功能来提供封面艺术图片,而BIP又依赖于OBEX。所以封面艺术OBEX连接时使用的目标标头为封面艺术专属的 UUID = 7163DD54-4A7E-11E2-B47C-0050C2490048。
链路建立成功后,AVRCP的CT端设备具有BIP成像发起者的作用,而对应的AVRCP的GT端设备具有BIP成像应答器的作用。
AVRCP命令的类型:
- AV/C命令,通过AVCTP的控制通道交互,存在如下两组命令:
(1):在AV/C规范中定义的Pass Through命令、UNIT INFO和SUBUNIT INFO命令,常用的播放、暂停、上下首切歌等控制命令都是Pass Through命令
(2):AVRCP特有的AV/C命令,PASS THROUGH和VENDOR DEPENDENCE命令扩展的 - 浏览命令,通过AVCTP的浏览通道交互
- 封面艺术命令,通过OBEX建立的连接交互
AVRCP协议中特有的常见命令我从手册摘取了一些如下图所示:
这里列举的常见命令,我就想说其中的绝对音量,我们知道目前市场上TG(手机)侧上的蓝牙音乐音量调节有如下两种方法:
1、音频数据增益(TG手机侧处理,然后传给蓝牙耳机、音箱)
2、绝对音量控制(CT蓝牙耳机、音箱侧处理)
方法1是将手机端调节的多媒体音量大小,转化为音频数据的音量增益来间接达到控制音量,多见于安卓系统的设备,最终的音量大小为音频数据音量和远端设备本身的音量设置共同作用的结果,下图为播放音乐时手机上调节音量大小后,远端设备上接收到的音频数据。
这个方法的有个问题:不支持绝对音量的手机,调节手机蓝牙音量响度时,会叠加设备本地的媒体音量增益,导致最大音量标准不一致。
解决方案:
1、判断出支持绝对音量和不支持绝对音量的设备
当收到TG侧发给CT侧RegisterNotification VolumeChange命令的时候,TG侧就是支持绝对音量
2、默认的时候所有的连接设备都按不支持绝对音量蓝牙音量增益处理按做大的最大。
当判断出设备时支持绝对音量设备的时候,就把增益调节回去。
当判断出设备时不支持绝对音量设备的时候,就取消蓝牙音量和媒体音量的叠加控制,避免最大音量标准不一致
方法2绝对音量控制音乐声音大小是我要说的重点:通过绝对音量控制可以实现CT和TG两端的音量设置同步改变,允许CT端展示音量百分比等级,多见于IOS系统(默认采用蓝牙绝对音量控制),还有少量安卓手机如小米红米,安卓系统上该功能是默认关闭,需要主动进入开发人员选项中将蓝牙绝对音量开关打开:
绝对音量:Absolute volume,使CT和TG两端的音量等级相同,允许CT端展示音量等级,该功能主要提供了如下两个命令来处理音量
总结就两个命令
- SetAbsoluteVolume:设置绝对音量,音量变化的一方主动将音量等级设置到对方
- RegisterNotification:注册音量变化的通知事件,来观察音量变化,对方音量等级改变后通过监听来改变本端的音量等级
结合抓包分析绝对音量
TG手机侧改变音量时,支持绝对音量的设备的行为
- 手机侧会先发给耳机测Notify RegisterNotification VolumeChanged的命令
2. 耳机侧会回给手机侧interim RegisterNotication-VolumeChange 并本次手机端显示的Volume的百分比
前两条命令注册音量变化的通知事件,来观察音量变化,对方音量等级改变后通过监听来改变本端的音量等级
3. 手机端会发给耳机端Control SetAbsoluteVolume的音量百分比命令
4. 耳机端会同步给手机端Accepted SetAbsoluteVolume的音量百分比命令
后两条命令设置绝对音量,音量变化的一方主动将音量等级设置到对方
CT耳机侧改变音量时,支持绝对音量的设备的行为
1、耳机侧给手机侧发个Changed - RegisterNotification Volume的命令,并显示当前耳机侧音量百分比
2、手机侧会先发给耳机测Notify RegisterNotification VolumeChanged的命令
3、耳机侧会回给手机侧interim RegisterNotication-VolumeChange 并显示本次耳机侧端显示的Volume的百分比