背景
最近一直在更新博客,我觉得写博客有三个好处,一是很多东西时间久了就会忘,记下来方便自己以后回忆和总结,二是记下来可以加深自己对知识的理解,三是可以知识分享,方便他人。
言归正传,今天分享我曾经做过的某高端蓝牙耳机的A2DP音频卡顿原因分析和解决思路,A2DP音频卡顿从LOG方面看,一般都能从Audio DSP的错误log看出来:
问题及解决思路
audio dsp下溢
也就是underflow错误,意思是DSP那边拿不到数据帧造成的音频卡顿,这类错误有可能是耳机的BT HOST或者 controller的问题:
问题 | 案例分析 | 解决思路 |
---|---|---|
耳机BTH问题 | 比如我曾经碰到过的情况就是BTH在接受手机音乐的同时,又发生了其他调度,需要上行通过HFP协议上报电量等,由于耳机主CPU的mips不足,调度不及时,造成BTH没有及时读取BTC的audio数据。 | 这种一般需要临时提高主CPU的mips。 |
耳机BTC问题 | BT Controller的问题就是由于某些原因,从手机收包不及时导致,比如耳机在接受A2DP音频流的同时,进行了BLE 扫描,过高的扫描占空比导致BTC收包不及时,也有可能是信号问题导致重传太多,收包不及时等等。 | 这种需要BT Controller具体分析了,BLE占空比太高就要想办法消减或者打散,信号问题就要和硬件一起分析。 |
手机蓝牙问题 | 比如我曾经碰到过在播放高清音频的时候,手机发过来的包就有丢包,后来发现手机在播放高清音频的同时,在做BLE SCAN造成的,过高的BLE占空比造成了音频发包有很大延迟 | 需要把BLE SCAN的window打散,不能造成音频的丢包 |
audio dsp上溢
也就是overflow错误,意思是蓝牙这边送到DSP的数据帧太多,导致DSP解码播放不及时造成的卡顿,这类错误有可能是DSP本身的问题或者是蓝牙的问题:
问题 | 案例分析 | 解决思路 |
---|---|---|
DSP本身问题 | DSP本身性能不足,由于某些导致播放速度太慢造成的问题 | 需要DSP查看为啥cpu load太重 |
蓝牙的问题 | 比如我曾经碰到过手机蓝牙的高清音频通过动态码率发送,一时大量数据发送过来,造成了audio DSP播放不及时 | 可以通过加大DSP接收buffer解决问题 |
SN或者TS不连续
sn和ts是保证蓝牙数据包能被audio dsp解码播放的关键参数,如果发生了SN或者TS不连续错误,说明蓝牙存在丢包或者重复收包的可能:
问题 | 案例分析 | 解决思路 |
---|---|---|
手机蓝牙问题 | 手机发过来的数据就有SN或者TS不连续 | 可以通过抓取手机蓝牙音频数据,然后dump出来,通过音频软件分析,比如adobe audition就是个很好的音频分析软件 |
耳机BTC问题 | 耳机蓝牙芯片由于某些原因存在丢包的发生 | 这个需要bt controller具体分析 |
DSP性能不足或者解码错误
这类错误一般都是DSP自身的错误,需要DSP去查看。
总结:
以上这四类蓝牙A2DP卡顿问题原因和解决思路是我在具体项目中碰到过的,实际中应还有其他的原因,我只能在此抛砖引玉。