蓝牙电话之HFP—电话音频

1 媒体音频:

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

2 电话音频:

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

1 编码格式

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

mSBC:该编码方式的数据传输只能使用eSCO链路。

2 安卓策略

音频链路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,以及反方向。那么语音数据都是在底层传输的,上层基本涉及不到,从而开发蓝牙电话时获取语音数据就显得尤为困难,但方法也是有的。

3 sco 与 esco

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

4 HFP协议

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

AG(Audio Gate)音频网关---音频设备输入输出网关

HF(Hands Free)免提---该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。

在车载蓝牙中,手机侧是AG,车载蓝牙侧是HF,在android源代码中,将AG侧称为HFP/AG,将HF侧称为HFPClient/HF。
蓝牙协议--HFP协议--转

相关推荐
liulilittle8 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
guts°11 小时前
17-VRRP
网络·智能路由器
Jewel Q11 小时前
动态路由协议基础
网络·智能路由器
宇称不守恒4.012 小时前
2025暑期—06神经网络-常见网络2
网络·人工智能·神经网络
Dreams_l13 小时前
网络编程2(应用层协议,传输层协议)
运维·服务器·网络
数据与人工智能律师13 小时前
数字迷雾中的安全锚点:解码匿名化与假名化的法律边界与商业价值
大数据·网络·人工智能·云计算·区块链
先知后行。13 小时前
网络协议HTTP、TCP(草稿)
网络·网络协议
源码_V_saaskw13 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
xzkyd outpaper13 小时前
QUIC协议如何在UDP基础上解决网络切换问题
网络·计算机网络·udp·quic