• 蓝牙电话之HFP—电话音频


    1 音频类型

    一 媒体音频:

    播放蓝牙音乐的数据,这种音频对质量要求高,数据发送有重传机制,从而以l2cap的数据形式走ACL链路。编码方式有:SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式,最基础的编码方式是SBC,支持蓝牙多媒体播放的设备必须支持该编码方式,编码质量最好的是LDAC。编码方式的选取需要蓝牙连接设备间的互相协商确定。

    二 电话音频:

    蓝牙通话过程的语音数据,这种音频对时效性有高要求,一般通过特殊的SCO或eSCO链路传输数据。编码方式有:CVSD、mSBC。最基础的编码方式为CVSD,免提蓝牙设备都需支持该编码方式,支持宽带语音的设备可选mSBC编码数据。

    2 编码格式

    在这里插入图片描述
    CVSD:该编码方式的数据传输使用SCO或eSCO链路。链路的选取是根据本端Controller是否支持Enhanced Setup Synchronous Connection指令来决定的,如果支持该命令则创建语音音频链路时使用eSCO,否则创建SCO链路。
    mSBC:该编码方式的数据传输只能使用eSCO链路。

    3 协议架构

    在这里插入图片描述

    4 安卓策略

    音频链路SCO或eSCO创建成功后,蓝牙系统会以 AUDIO_STATE_CHANGED 的广播通知注册过的应用,并且HF侧的蓝牙芯片会将接收到的语音数据通过PCM接口送入audio系统,那系统的audio模块是如何操作避免多音源输出呢 ?

    这其实还是和蓝牙电话应用密切相关的,蓝牙电话收到音频链路创建成功的广播后通过AudioManager.requestAudioFocus()申请到系统的音频焦点后,audio模块会根据申请焦点的stream type判断其级别,高级别的音源可以打断低级别的音源(比如:听音乐时打电话,会先暂停掉音乐)。蓝牙电话还需要通过AudioManager.setMode()接口通知audio底层打开通话通道,从而播放出通话语音。

    蓝牙电话一般还会有个电话静音功能,开启静音功能后,本端可以听到对方的语音,但对方听不到本端的语音,这样一个功能其实只需要将本端的收音设备给静音掉就可实现。AudioManager.setMicrophoneMute()设置true,将Mic静音。

    由于蓝牙电话语音的传输途径为:phone Audio -> PCM -> AG基带 -> HF基带 -> PCM -> Audio,以及反方向。那么语音数据都是在底层传输的,上层基本涉及不到,从而开发蓝牙电话时获取语音数据就显得尤为困难,但方法也是有的。

    5 sco 与 esco

    sco 不支持重传,esco支持重传
    Android 蓝牙 HFP sco 和esco链路的异同分析

    6 HFP协议

    目前HFP的使用场景有车载蓝牙,耳机和PDA,定义了AG和HFP两种角色。

    AG(Audio Gate)音频网关—音频设备输入输出网关
    HF(Hands Free)免提—该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。
    在车载蓝牙中,手机侧是AG,车载蓝牙侧是HF,在android源代码中,将AG侧称为HFP/AG,将HF侧称为HFPClient/HF。
    蓝牙协议–HFP协议–转

  • 相关阅读:
    openwrt Docker不能联网
    基于声卡实现的音频存储示波器,可作为电磁学实验的测量仪表
    PHP 动态获取Excel表格字母列
    web(2)
    CPP-Templates-2nd--第二十章 基 于 类 型 属 性 的 重 载(Overloading on Type Properties)
    kafka消费端消息去重方案
    用ChatGPT做一个Chrome扩展 | 京东云技术团队
    Leetcode406. 根据身高重建队列
    QT 客户端软件开发
    在 Python 中使用 Pillow 进行图像处理【3/4】
  • 原文地址:https://blog.csdn.net/aningxiaoxixi/article/details/133054356