• 基于AVDTP信令分析蓝牙音频启动流程


    前言

    公司项目edifier那边需要在原来音频SBC,AAC基础上增加LHDC5.0编码,在打通lhdc协议栈之前,学习记录一番AVDTP音频服务流程。


    一、AVDTP音频流基础知识

    分析音频流程首先应具备的最简单基础概念知识:AVDTP信令signal,流端点sep

    二、流程分析

    先上我打通的SBC+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 如下:

    1. typedef struct seid_info {
    2. uint32_t rfa0:1;
    3. uint32_t inuse:1;
    4. uint32_t seid:6;
    5. uint32_t rfa2:3;
    6. uint32_t type:1;
    7. uint32_t media_type:4;
    8. }__attribute__ ((__packed__)) seid_info_t;
    9. typedef struct avdtp_sep_info {
    10. uint8_t state;
    11. seid_info_t info;
    12. }__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 LHDC)跟手机本身支持的数据类型对比,然后选择恰当的数据类型进行音频传输,同时耳机端也会根据该信令的配置配置好本地的解码器,准备接收手机端数据进行解码播放。耳机端确认好配置包之后,回传accept命令包给手机。

    4,AVDTP_START

    该信令告诉耳机端,数据流开始,并且返回accept包。

    5,media stream

    媒体流传输并非avdtp信令内容,其内容主要是传输音频数据包!至此,耳机和手机启动音频传输过程完成。

  • 相关阅读:
    电商场景下 ES 搜索引擎的稳定性治理实践
    H5移动端文件预览pdf
    2.5 logistic 回归初认识
    python第三方库-argparse的使用(简单实用)
    apisix健康检查测试
    矩阵分析与应用-4.7-QR分解及其应用-Section2
    sync.map 源码学习
    制作温馨浪漫爱心表白动画特效HTML5+jQuery【附源码】
    linux对一个文件夹中的所有文件重命名
    Tomcat 基线安全加固操作
  • 原文地址:https://blog.csdn.net/louis_bao/article/details/128204380