大家好,我是HiFier 高品质播放器的开发者,HiFier致力于高品质音乐播放;最近在用户QQ群里发现有用户分享了一款同类的安卓平台的音乐播放器,里面有对手机蓝牙协议的相关配置,作为一个追求高品质音乐播放的App的作者,对这个东西就非常好奇,看看到底是怎么样的技术,如何实现的,自己的App需要不需要实现等等。

某个音乐播放器的蓝牙设置页面

这个配置页面的意图很明显,就是要通过设置安卓系统和蓝牙耳机协商的参数,来和当前播放的音频格式进行匹配,从而得到“原始的,无损的”音乐。

我先尽量简单明了的把整个的实现逻辑说一下:

比如当前播放的一个无损音质的文件,采样率是44.1kHz,播放器知道这个采样率后就去强制把系统的蓝牙采样率设置成44.1kHz,这样能完美输出pcm,音质最好。

当播放的音频的采样率是 176.4kHz的时候(可能在播放DSD音乐降频输出的时候会用到这个采样率)他可以以整数倍匹配来输出到 88.2KHz,这样只要隔一个采样丢一个就可以了,在采样过程中损失最小。这里大家可能有个疑问,为什么不直接输出 176.4kHz呢?因为蓝牙设备不支持这么高的采样率。

我找了另外一款软件,专门用来修改系统蓝牙属性的,我给大家看看截图:

图上显示我连接的一款索尼的WH-1000XM4的蓝牙耳机,这个耳机目前的连接状态是 96kHz 32bit 双声道,编码码率是990kbps,相当于运行在了最高的音质模式下。耳机支持的采样率 44.1k, 48k, 88.2k 最高96k。这也就是之前上一个播放器里面说的88.2k输出的来源了。

这样看来,似乎这种做法非常合理,并且完美地绕过了安卓系统SRC的重采样,实现了bit-perfect的输出。但是真的是这样吗?我们就来分析一下。

安卓系统音频架构

在Android平台任何App播放声音都要走系统的通道,普通的播放方式默认走系统的AudioFlinger,AudioFlinger把所有app的声音都通过重采样和混合后变成一个固定采样率的声音输出;如果连接的是蓝牙设备,这个固定的频率就是系统自己和蓝牙协议协商的频率,当然,我们通过上面的软件强行修改后,就是我们修改后的频率,在这种情况下,当系统无任何其他声音的时候,AudioFlinger是有机会对输入的pcm数据不做任何处理然后再输出到蓝牙控制器上的。但是这里又有一个坑,AudioFlinger不止做混音,他还做音量调节,默认情况下,只要系统音量不是100%, 他都会把过来的pcm数据进行软件音量调节,简单来说大概是把混音后的数据的每个采样点乘以一个比例,这个时候所有的pcm数据全都变了,而且这个过程大多数情况下是有损的; android系统在连接蓝牙设备时有个选项可以关闭这个绝对音量的功能,但这个东西在手机的开发者选项里面,大多数用户不会去改他。因为改了以后可能出现非常不好的用户体验。这道坎就已经卡住了大多数用户。

假如上面的绝对音量被关闭了,那后面是不是就可以无损输出了呢,先说结论,完全不行!下一步就到了蓝牙控制器里面了,他不是直接把PCM数据发给耳机,而是对这个PCM数据进行编码,也就是上面的图中可以设置的编码方式,比如我当前的方式是 LDAC 990kHz,但这里有个常识,LDAC的编码是有损的,下图是我在索尼官网相关的页面上的截图

所以到这里,所有的幻想都破灭了,然后前面花心思搞的采样率匹配也没有任何意义了,所有的用高采样率来提高音质的前提都是无损才有意义,你这都有损了,采样率高到天上去又有啥意义呢,和假升拼算法有啥区别吗?

而且他这个带宽最高是接近1M,就是连CD的音质都达不到,不管你给他再高的采样率的数据,由于他输出的带宽被卡了脖子,最终输出的音质不会有啥区别。

这里大家肯定有个疑问,接近1M的码率,完全可以传递无损的数据了呀,像FLAC编码700K左右就可以编码CD音质的无损音乐了。这里的问题是这样的,FLAC这种编码方式,不适合蓝牙设备使用,对于蓝牙耳机来说,低功耗是他最重要的参数,给他输出一个FLAC的编码,不但延迟大的问题解决不了,解码需要更强的cpu,也就是更耗电,这是完全接受不了的;所以LDAC虽然提高了码率,但是编码效率并没有匹配的提高,也就是码率提高了三倍,但是音质没有提升三倍,因为如果音质也提升三倍,耳机解码那边受不了;所以整体上虽然你用ldac编码三倍的码率,可能并没有比用AAC编码的普通协议音质提高多少;至少我在测试过程中没有察觉到什么区别。

但是带来的坏处很多

  1. 首先肯定是比以前更耗电了
  2. 其次,蓝牙一直都是跑在2.4G这个频段里的,干扰非常严重,在正常需要使用蓝牙耳机的场景下,根本无法一直保持在最高码率上。
  3. 索尼把自家的LDAC算法库放到了开源的Android系统中,然后这个从PCM到LDAC的编码过程就是你手机的cpu一直在跑,而之前的SBC或者AAC绝大部分手机里的dsp都支持硬编码,不需要cpu参与。
  4. LDAC的耳机需要索尼授权,价格更高了。

关键这里还有更坑的事情,这个Hi-Res Wireless金标认证的门槛相当低,只要你的蓝牙编解码器理论上能支持到 96kHz/24bit(哪怕它中间把数据压缩得面目全非、哪怕实际发声的喇叭单元成本只要几块钱、频响曲线稀碎),只要交了认证费、走完流程,就能堂而皇之地把这个金标贴在包装盒最显眼的地方。

这里还有个技术细节,在Android上去修改系统蓝牙配置其实是没有正常接口的,需要系统级别的App才有权限修改,比如设置App,也就是Android系统并不希望总改这个东西,因为可能会造成其他故障,上面的App都是用了逆向工程技术,绕过了这些限制来修改的。现在看看,图啥呢。。。

所以我也有了最终的结论,HiFier不会去做这种商业上的炒作功能,做了就是和他们同流合污地欺骗用户。