蓝牙耳机这样设计,有效降低延迟
本文详细讲解了蓝牙延迟是怎么产生的,并介绍了一些设计上降低延时的方法以及简单描述了如何使用恒玄BES2700有效降低延时
什么是蓝牙耳机延时
我们经常听说的蓝牙延时,有全链路延时和蓝牙延时两种说法。
全链路延时:全链路延时是指用户在手机上点击开始播放开始计时,到耳机听到声音的这段时间。
一般来说手机自身的延时就已经很大了。用户点击播放的时候手机一般来说需要做的事情有:触摸识别->打开音频->音频编码->编码完成才会进行蓝牙传输。
蓝牙延时:从手机编码完成,蓝牙音频开始传输的这一时刻开始计算到耳机播放出声音的这段时间。(一般情况在AP等测试仪器上测试的都是蓝牙延时)
延时一般发生在:编解码延时、传输延时和处理延时。
编码延迟
有小伙伴会提问既然编码会发生延时,那为什么要编码。
一般手机上的音乐格式都是mp3,wav等格式。手机通常会将这些文件先解码转换成原始文件后再编码形成蓝牙支持的格式(SBC、AAC、aptx等)
首先是蓝牙传输会受到蓝牙带宽的限制(通常只有1-3 Mbps),而高质量音频的原始数据量远超这一限制。考虑到实时传输稳定性,直接传输原始数据可能导致卡顿或断连,因此需要通过编码压缩降低数据量。
其次是耳机蓝牙音频协议(A2DP)不支持这些格式的传输,音频播放是实时流,而非文件传输。蓝牙耳机需要持续接收、解码数据。A2DP框架下的SBC等蓝牙编码是专为实时流设计,可以通过动态调整码率和分片传输,确保音频连贯性。所以蓝牙音频传输时候需要用到蓝牙支持的格式(也就是SBC、AAC、LHDC、aptx等等编码格式)进行压缩之后来传输音频。以下为各编码延迟对比。
减小延时的方法
以下列举了一些减少延时的方法:
- 手机进入游戏模式,减小其他资源占用,这样手机能更快完成编码。
- 使用更高效的音频格式。(手机在蓝牙传输之前需要进行编码,用SBC格式编码一般都会用200ms左右了,全链路延时肯定不会低,aptx LL宣称<40ms的编码时间,用LC3编码延时可以做到20-30ms)
- 软件上升级最新蓝牙版本。(蓝牙5.2核心协议的延时就会比之前5.0的低)
- 选用每家芯片自身的蓝牙自适应跳频AFH策略不一样,需要降低延时应选用更先进的芯片方案。(就像开车一样,车道选择不同可能也会影响最后到达目的地的时间,自适应跳频策略就好比自动跳到最优车道的选择策略)
- 优化RF或测试时排除信号干扰(比如手机不打开wifi、在屏蔽箱内测试排除wifi干扰、耳机尽量靠近手机等),减少耳机与手机之间传输错误导致的蓝牙重传。
- 耳机降低码流,降低码流意味着耳机与手机之间传输数据少了。蓝牙耳机可以更快地进行解码播放。降低码流的缺点自然是耳机播放音频音质会降低。
- 蓝牙参数调优:缩短连接间隔,可以从默认20ms,减小到7.5ms->15ms,减少蓝牙数据等待时间;调整传输MTU大小,适当增加单个数据包容量,减少分包次数。
- 缓冲区大小的设定:蓝牙耳机从手机端获取到数据后,因为数据量不够而不能解码的原因,往往需要接收一定数据量的数据之后才能传送给解码器进行解码。所以耳机系统设计会有个音频接收buffer用来存够一定量数据之后才会传送给解码器。耳机端的延时也主要取决于缓存buffer的长度。减少缓存buffer长度,缓存更少的数据,解码器能更快地进行解码播放,延时时间就可以做得更低。减少buffer缓存的缺点就会导致耳机蓝牙抗干扰能力变弱,因为数据量少了,一旦蓝牙接收出错,更容易导致音频卡顿的现象。
恒玄BES2700降低延迟实例
从以上原理可知,整个链路上的延时主要集中在数据buffer缓存的时候。
所以我们在使用BES2700进行耳机端开发时,降低延时的一般有以下处理:
- 首先硬件上必须把耳机的射频表现优化到极致,减少实际场景工作中的数据重传和丢数现象。
- 减小蓝牙数据包的颗粒度有助于减小缓存buffer的长度,这样可以缓存更少的数据,如下图所示。