前言
公司项目edifier那边需要在原来音频SBC,AAC基础上增加LHDC5.0编码,在打通lhdc协议栈之前,学习记录一番AVDTP音频服务流程。
一、AVDTP音频流基础知识
分析音频流程首先应具备的最简单基础概念知识:AVDTP信令signal,流端点sep
二、流程分析
先上我打通的SBD+LHDC5.0协议在手机主动连接耳机情况下的爱丽丝截图:
从图中可以看到,AVDTP的音频流程其实并不复杂,主要有5个步骤: 手机发现耳机(Discover)、分别获取耳机各个配置包(get capability)、设置手机和耳机所使用的配置、打开(开始)流端点和手机发送数据流。如下图红色框框部分:
AVDTP启动音频流流程做以上6个步骤分析:
1、AVDTP_DISCOVER:
该步骤ellisys数据如下:
首先sink接收到src的AVDTP_DISCOVER信令之后,会返回当前sink的avdtp所有的流端点ID包,包的内容只是简单的告诉src该类型的端点使用的流端点ID,流媒体数据类型,端点状态等信息。上面所使用的流端点结构avdtp_sep_info_t 如下:
typedef struct seid_info {
uint32_t rfa0:1;
uint32_t inuse:1;
uint32_t seid:6;
uint32_t rfa2:3;
uint32_t type:1;
uint32_t media_type:4;
}__attribute__ ((__packed__)) seid_info_t;
typedef struct avdtp_sep_info {
uint8_t state;
seid_info_t info;
}__attribute__ ((__packed__)) avdtp_sep_info_t;
由此可见每个端点占用3个byte的payload,上图抓包显示的6个bytes数据,获取到的是sbc+lhdc 2个端点信息。
2、AVDTP_GET_CAPABILITIES
AVDTP_GET_CAPABILITIES信令需要返回具体流端点的配置信息,如上图返回的是sbc流端点的配置,其配置内容根据标准sbc数据配置包属性确定,内容包括媒体类型,音频类型,采样率等等信息。
3、AVDTP_SET_CONFIGURATION
AVDTP_SET_CONFIGURATION信令用来设置耳机端使用的配置,用来告诉耳机你该用哪种音频的配置来进行解析、解码我的数据包。在上一步耳机上传了配置包之后,手机会拿耳机所支持的数据类型(AAC 、 SBC or others)跟手机本身支持的数据类型对比,然后选择恰当的数据类型进行音频传输,同时耳机端也会根据该信令的配置配置好本地的解码器,准备接收手机端数据进行解码播放。耳机端确认好配置包之后,回传accept命令包给手机。
4,AVDTP_START
该信令告诉耳机端,数据流开始,并且返回accept包。
5,media stream
媒体流传输并非avdtp信令内容,其内容主要是传输音频数据包!至此,耳机和手机启动音频传输过程完成。