4、HFP协议详解(下):SCO/eSCO音频连接建立、语音编解码器协商(CVSD/mSBC)、WBS宽带语音
好,咱们接着聊HFP。上一节我们把HFP的AT指令和Service Level Connection讲透了,这一节我重点说说音频连接这块。说白了,HFP的核心使命就是让你在车里打电话,那音频通道怎么建、用什么编码、音质好不好,全看这一节的内容。
我个人习惯把SCO/eSCO比作「蓝牙电话的生命线」。没有它,你喊破喉咙车机也听不见。嗯,这里要注意,很多开发者把精力都放在AT指令上,结果音频链路一塌糊涂,电话打起来断断续续,用户直接骂娘。
SCO与eSCO:两种音频连接方式
SCO,全称Synchronous Connection Oriented,同步面向连接。它是最早的蓝牙语音传输方案。我记得在蓝牙2.0时代,几乎所有蓝牙耳机都用SCO。它的特点是固定带宽、固定时隙,说白了就是「死板但可靠」。
eSCO呢?Enhanced SCO,增强版。它在SCO基础上加了重传机制。你想想看,无线环境里丢包是家常便饭,SCO丢了就丢了,eSCO还能抢救一下。我在项目中遇到过,在车载这种强干扰环境下,eSCO的语音连续性明显优于SCO。
| 特性 | SCO | eSCO |
|---|---|---|
| 重传机制 | 无 | 有(最多2次重传) |
| 带宽 | 64 kbps | 64-128 kbps |
| 延迟 | 固定,较低 | 略高,但更稳定 |
| 抗干扰 | 弱 | 强 |
| 典型应用 | 老式耳机 | 车载、TWS耳机 |
核心要点:HFP 1.6及以上版本强制要求支持eSCO。如果你还在用SCO做车载产品,赶紧升级。这不是建议,是必须。
音频连接建立流程
音频连接不是凭空产生的。它必须建立在SLC(Service Level Connection)之上。流程大概是这样的:
- SLC建立完成——AT+BRSF交换完双方能力,AT+CIND注册好指示器。
- 发起音频连接——HF或AG都可以发起。通常AG(车机)主动发。
- 协商连接参数——包括SCO/eSCO类型、编解码器、包长度等。
- 建立SCO/eSCO链路——底层LMP完成握手。
- 开始传输语音——CVSD或mSBC数据流开始跑。
我曾经调试过一个项目,SLC明明建好了,但音频就是起不来。查了半天,发现是AG端没有正确响应HF的AT+CMER命令。嗯,这种坑我踩过不止一次。
语音编解码器协商:CVSD vs mSBC
编解码器协商是HFP协议里最容易出问题的地方。说白了,就是两边商量好「咱们用哪种方式说话」。
CVSD:老将出马
CVSD(Continuously Variable Slope Delta Modulation)是蓝牙最传统的语音编码。64 kbps固定码率,算法简单,延迟低。但音质嘛……也就那样。我个人的感觉是,CVSD听起来像老式电话,高频信息基本被砍光了。
mSBC:宽带救星
mSBC(modified Sub-Band Coding)是WBS(Wide Band Speech)的核心。它工作在16 kHz采样率,码率也是64 kbps,但音质比CVSD好太多了。你想想看,CVSD只有8 kHz采样,mSBC翻了一倍,人声的清晰度和自然度完全不是一个级别。
我的建议:如果你的车机硬件支持,优先走mSBC。现在主流蓝牙芯片都支持,别省那点算力。用户对电话音质的敏感度远超你的想象。
WBS宽带语音:从「能听」到「好听」
WBS(Wide Band Speech)是HFP 1.6引入的重要特性。它让蓝牙电话从「窄带」(300-3400 Hz)升级到「宽带」(50-7000 Hz)。
为什么重要?因为人声的很多细节信息都在高频段。比如「s」「f」这些擦音,窄带下基本听不清。WBS一开,对方就像站在你面前说话。
WBS的协商过程是这样的:
AG: AT+BRSF=...
HF: +BRSF: ... (bit5表示WBS支持)
AG: AT+BCS=... (发起编解码器协商)
HF: +BCS: ... (确认编解码器)
AG: AT+BAC=... (列出支持的编解码器)
HF: OK
这里有个坑:WBS协商必须在SCO/eSCO建立之前完成。一旦音频链路建起来,再想切编解码器就难了。我见过一个方案,AG和HF都支持WBS,但协商顺序搞反了,结果一直跑在CVSD上。用户投诉音质差,查了三天才找到原因。
避坑指南:我曾经在某个项目中,HF端先发了AT+BAC,AG端没响应。后来发现是AG端的HFP版本太低,根本不认识这个命令。所以,一定要在AT+BRSF里确认双方都支持WBS,再往下走。
实际调试中的几个关键点
- 包长度选择:eSCO支持多种包类型(如EV3、EV4、EV5、2-EV3等)。包越长,效率越高,但重传代价也大。车载环境下,我建议用2-EV3或3-EV3,平衡延迟和可靠性。
- 重传次数:eSCO最多支持2次重传。别贪心,设多了延迟飙升,设少了抗干扰差。2次是业界共识。
- 编解码器优先级:如果AG和HF都支持mSBC,优先用mSBC。如果一方不支持,fallback到CVSD。这个逻辑一定要写对。
- 同步问题:SCO/eSCO是同步链路,时钟由蓝牙控制器管理。应用层别去干预,否则容易出乱子。
嗯,这一节的内容差不多就这些。SCO/eSCO的建立、CVSD和mSBC的协商、WBS的引入,这三块是HFP音频的核心。下一节我们会讲HFP的呼叫控制流程,包括接听、挂断、三方通话等。到时候你会发现,音频链路建好了,剩下的就是AT指令的活了。
最后说一句:音频链路是HFP的命脉。协议栈写得再好,音频链路不稳,一切都是白搭。调试时多用抓包工具看HCI日志,SCO/eSCO的建立过程一目了然。