从空口分析经典蓝牙A2DP和AVRCP协议
经典蓝牙的音乐播放依靠AVDTP协议进行数据传输,AVRCP进行播放控制,下面还是以手机和耳机为例,看看AVDTP和AVRCP是如何在音乐播放中协调和配合:
1:AVDTP起播前的协商
在SDP发现服务找到耳机支持了AVDTP音频协议后,就会进行AVTDP服务的协商,大概就是手机需要知道耳机有几个sink端点以及相应的支持哪些codec,然后手机根据自己的场景(音乐,游戏等)去选择合适的端点和codec去传输音频数据,如下图:
从上图可以看到AVDTP起播前的协商分成四个步骤:AVDTP Discover, AVDTP Get Capability,AVDTP Set configuration, AVDTP Open,如红色框框所示,下面来对这四个步骤一一解析:
1:AVDTP Discover
这一步就是手机去发现获取耳机支持多少播放端点:
如上图,右边红色框框是耳机回复给手机的查询结果:可以看到耳机支持4个播放端点,编号为1-4,媒体类型都是audio,端点类型都是sink。
2:AVDTP Get Capablility
这一步是在手机通过AVDTP Discover发现对方有四个播放端点后,然后发起4条get capability命令去分别获取四个端点的codec信息,这里我们以端点2为例,来看一下耳机回复给手机都有哪些内容:
如上图右边红色框框,这是我们主要关注的东东,可以看到端点2支持的codec type为AAC编解码,采样率是44.1KHZ,支持立体声,支持VBR(也就是动态码率,手机端可以根据接收RSSI来动态调整传输码率)。
3:AVDTP Set Configuration
经过上面两个步骤,手机已经获取到耳机的播放端点和相应的codec的参数信息,这一步就是手机会根据自己的场景,比如当前是音乐播放,然后就会默认去选择端点2的AAC 编码方式传输音频数据:
如上图右边红色框框,手机通过set configuration设下去的参数:
参数 | 值 | 解释 |
---|---|---|
ACP SEID | 2 | 这里的ACP就是acceptor的意思,因为音乐是从手机传出,耳机接受,所以耳机是ACP |
INT SEID | 2 | INT是initiator的意思,就是发起者,这里手机是这个角色 |
Service Category | Media Codec | 媒体音乐编码 |
Media Type | Audio | 媒体类型是音乐 |
Media Codec Type | MPEG-2,4 AAC | 手机采用AAC编码方式传输数据 |
Sampling Frequency | 44.1kHz | 采样率44.1KHZ |
Channels | 2 | 采用双声道方式传输 |
Variable Bit Rate | Yes | 支持动态码率传输 |
Bit Rate | 165 kbit/s | 传输速率采用165k bit/s |
4:AVDTP Open
这个命令比较简单,就是手机通知耳机打开端点2,做好准备接受音频数据:
5:AVRCP Registration Notification(playback , volume)
经过上面4个步骤,手机和耳机协商好了播放端点和所采用的codec参数,并且耳机的端点也做好了接受音频数据的准备,但是耳机要知道播放器的状态(比如起播,暂停,下一首)和音量需要通过AVRCP协议来实现:
从上图红色框看到耳机向手机注册了一个playback事件:耳机发起AV/C Notify注册,然后手机通过AV/C Interim回复当前状态,只有当手机的播放器状态发送变化的时候,手机会通过AV/C Changed通知耳机,需要注意的是这种注册都是一次性的,就是说一旦耳机收到AV/C changed通知,耳机需要向手机重新注册事件。
绿色框是手机向耳机注册了音量时间:同理,如果耳机有音量变化,那么耳机就会通过AV/C Changed来通知手机。
2:AVDTP起播
经过上面起播前的准备后,如果手机音乐播放器开始播放音乐,那么手机就会通知耳机起播了,下面看看起播都需要发哪些命令:
- 首先是手机通过AV/C Interim通知耳机当前播放器的状态是playing,如上图红色框。
- 手机发送AVDTP Start命令给耳机,就是告诉耳机,手机要起播了,你做好接收准备,如紫色框框。
- 耳机汇报一个delay report给手机,时间是190ms。这里解释一下 AVDTP delay report,这个参数是用于手机播放音视频同步的。因为我们知道手机音频传输到耳机,然后耳机接收存buffer,然后在audio DSP解码这是需要一定的时间,如果手机在发送音频数据后就开启视频播放,那么势必造成音视频不同步,现在耳机告诉手机,你的视频需要delay 190ms再播放,这样音视频就同步了。
- 注意一下上图的红色框,这里是playback paused,看一下时间就知道这个是手机播放了27秒后,手机通知耳机音乐暂停的AVRCP 命令。
3:AVDTP音频播放
接下来看一下音频数据在蓝牙中传输的格式:
如上图,我们看到AVDTP Media packet通过2-DH1格式传输,需要注意的是每个数据包的右边红色框框的两个参数:
- Sequence Number:也就是蓝牙给每个数据包的编号,从1-0xffff,便于数据的接收和校验,注意audio DSP是不需要知道sequence number,它只需要下面的这个参数Timestamps。
- Time Stamp:这个参数是提供给audio DSP用于比对数据帧的时间戳,做解码同步用。也就是说如果time stamp不对,解码就会出错。
4:AVDTP音频暂停SUSPEND
音乐暂停也挺简单的,如上图,也就三个步骤:
- 手机发送AVDTP Suspend 命令,然耳机暂停,如绿色框
- 两秒后,手机发送AV/C Changed 通知耳机手机播放器暂停了,如红色框
- 耳机重新注册播放器事件,如黄色框
5:AVDTP停播
AVDTP停播,这个也很简单就一条命令:AVDTP Close,如下图