DreamCity

愿你有一天,能与你最重要的人重逢

本来我想给这篇博文起名叫「在 Windows 上使用 LDAC 编解码器的终极解决方案」(The Ultimate Solution For Using LDAC Codec On Windows),结果一番折腾下来,得出的最好的解决方案居然是——不用 Windows(笑。

去年 9 月,我入手了一副索尼 WH-1000XM3。我一直想要一副头戴大耳,长时间持续佩戴入耳式耳机还是会有些不舒服,而且受限于体积,入耳式耳机主动降噪的效果也没有头戴式耳机好(更别说 AirPods Pro 的固件更新对主动降噪一砍再砍了)。所以当我看到拼多多上国行 XM3 只要一千块钱的时候——尽管那时它已经是上一代产品了但是在京东自营上它还是要一千六百块——我几乎完全没有犹豫就下单了。

众所周知,索尼的中高端蓝牙耳机有一个卖点是索尼自家的 LDAC 编解码器,它可以实现最高 990Kbps 码率(24-bit/96KHz)的蓝牙音频传输;并且,得益于高通的 SoC,除了 LDAC 之外,XM3 还支持 aptX 和 aptX-HD 编解码器(不过 XM4 换成 MTK 的 SoC 之后就不支持了 aptX 了)。而最近,我开始通过在 Windows Subsystem for Android 上运行 Android 版本的 Apple Music 这种“奇技淫巧”来听无损音乐(iTunes 不支持串流无损音频)。但是 Windows 对蓝牙音频的支持一直都不是很好,即使是最新的 Windows 11 也只支持 SBC 和 AAC 编解码器(对,尽管有很多传言称 Windows 10 会支持 AAC,但实际上到了 Windows 11 才真正支持),完全和无损音频挨不上边,而我也没钱买小尾巴或者外置 DAC 之类的,更不想整天拖着根线(真的很麻烦!),所以就开始了尝试在 Windows 上使用 aptX 和 LDAC 编解码器的折腾之路。

apple-music-lossless

Windows 的默认情况

Windows 11 默认情况下在蓝牙立体声音频(A2DP)方面只支持 SBC 和 AAC 编解码器(更早版本的 Windows 甚至只支持 SBC)。尽管有传言称 Windows 10 开始自带 aptX 编解码器支持,但根据我在 Bluetooth Tweaker 中看到的,即使是在耳机支持 aptX 的情况下,Windows 仍然选择了 AAC 作为 A2DP 的编解码器。

windows-default-codec

看来想要在 Windows 上使用其他编解码器的话,就必须费点心思了。

使用支持 aptX / LDAC 的蓝牙适配器

我使用的蓝牙适配器是 Intel WiFi 6 AX200 网卡集成的蓝牙适配器,而 aptX 是高通的专利、LDAC 是索尼的专利,除非设备生产商(Intel 或者电脑的生产商)给高通或者索尼交钱,否则设备制造商提供的驱动里不太可能自带 aptX 和 LDAC 编解码器支持。

这种情况下,再买一个支持 aptX 或者 LDAC 的蓝牙适配器或许能解决。我搜了一圈,有不少高通方案的 USB 蓝牙适配器都宣称支持 aptX,价格也不贵,便宜的只要三五十块就能入手(当然连接质量和码率什么的就另说了…)。不过我并不是很喜欢笔记本上突出来一个 USB 接收器之类的东西,携带起来不是很方便,更别说它还要占用一个笔记本上本来就不多的 USB 接口了。所以我希望探索软件解决方案。

安装奇怪的驱动

如果你在 Google 上搜索「Windows aptX」,除了一票「Windows 10 自打一发布就支持 aptX」的传言之外,你还能看到一种解决方案:安装一个由 Dell 提供的奇怪的驱动

有传言说是 Dell 给高通交了专利费,所以就有了这么个驱动。从安装程序的标题上可以看出,这是一个适用于 Intel Wireless-AC 8260 网卡的蓝牙音频应用程序,安装后能使 Windows 支持 aptX 编解码器。根据国外论坛的说法,这个驱动可以在 Intel Wireless-AC 9560/9260/8260 网卡上工作(另外还有适用于 Intel Wireless-AC 7265/3165/7260/3160 网卡的版本,但是国外论坛好像没怎么提到),并且在连接支持 aptX 的耳机后,还会弹出通知告诉你「正在使用 aptX」。

但是,很遗憾,根据我的测试,这个驱动并不能与 AX200 配合使用。安装驱动后,连接耳机时确实有弹出「正在使用 aptX」的通知,在 Bluetooth Tweaker 里也能看到 Windows 选择的 A2DP 编解码器变成了 aptX,但是根本无法将耳机设置为音频输出设备,甚至有时在 Windows 音频输出设备设置中都找不到耳机。好在这个驱动的卸载也简单,再次打开安装程序,点击「卸载」就行。

如果你的电脑的网卡属于 Intel Wireless-AC 系列并且集成了蓝牙适配器的话,或许可以尝试安装这个驱动;如果不是的话,那还是放弃这个方案吧。

把音频传输到 Linux 里

这是我在 Reddit 上看到的迷惑操作,也是我原本想说的「终极解决方案」——但它完全不是听起来那么回事儿,操作起来麻烦得要死不说,也还是有一些问题。但这或许是在不要求额外硬件的情况下,在 Windows 上使用 aptX 和 LDAC 的唯一解决方案。

尽管 Windows 不支持 aptX 和 LDAC,但 Linux 上已经有音频服务器在比较新的版本上支持了(比如 PulseAudio 和 PipeWire),甚至有些在特性更新上比较激进的 Linux 发行版已经开始使用这些音频服务器作为默认音频服务器了(比如 Fedora 34 就换到了 PipeWire)。如果我们能把 Windows 上播放的音频传输到 Linux 上,再通过 Linux 将音频输出到耳机,就能曲线救国了。

Scream 是一个 Windows 上的虚拟声卡软件,它可以把输入到其中的音频通过 PCM 编码后串流,供客户端(接收器)接收并解码后输出。Scream 有 Unix 平台的接收器,为这种解决方案提供了便利。

实现这个方案的方法有很多,比如你可以开个 Linux 虚拟机(建议用预装 PipeWire 的发行版,会省事很多),装上 Scream 的 Receiver,再把蓝牙适配器整个透传进去,连接耳机。在音频服务器支持的情况下,默认的 A2DP 编解码器应该就会是 LDAC 或者 aptX 了。然后在 Windows 上将 Scream 设为音频输出设备,设置好采样深度和采样率,就能在耳机里听到 Windows 上的声音了;或者你也可以用树莓派或者其它开发板或者局域网内的其它设备来搭建接收器,流程是一样的。

这种方案有一个显而易见的弊端:传输的音频的质量受限于网络连接质量。根据我的测试,Scream 串流 32-bit/48KHz 的音频大概需要大约 4Mbps 的带宽,串流 32-bit/96KHz 的音频则需要大约 8Mbps 的带宽。如果是在本地的虚拟机上这么做还好,基本不会遇到网络问题;但如果 Windows 电脑和 Linux 接收器是通过局域网连接的两台设备,一旦设备分配到的带宽不足以传输音频(比如局域网内有人在看视频 / 下载大文件,占用了大量带宽),你就会有很明显的卡顿的感受(我对此深有感受)。这个问题可以通过降低 Windows 上 Scream 的虚拟声卡的采样深度和采样率来解决,但是这样就和我们聆听无损音乐的需求背道而驰了;而且 Scream 现在只支持 16-bit 和 32-bit 的采样深度,当输入的采样深度为 24-bit 时(LDAC 最高只支持 24-bit),Scream 会将其超采样到 32-bit 再传输,所以没办法通过更改采样深度为 24-bit 来减小带宽需求。

另一个弊端是,如果你选择通过虚拟机搭建接收器,那么你必须把整个蓝牙适配器都透传进虚拟机。现在个人常用的几个虚拟机平台(VMware、VirtualBox、Hyper-V)都不支持透传单个蓝牙设备(VMware 支持,但是它不支持透传蓝牙耳机),如果想在虚拟机内使用蓝牙设备,就必须把整个蓝牙适配器都透传进虚拟机。这样就没办法同时在宿主机上使用其他蓝牙设备了,对于有在宿主机上使用其他蓝牙设备的需求的人来说很不方便,除非再单独买一个蓝牙适配器专门来连接耳机——但是,既然都要多买一个蓝牙适配器,为什么不直接买支持 LDAC 或者 aptX 的蓝牙适配器呢?

除了以上两点弊端之外,这种方案还舍弃了一些东西,比如耳机自带的麦克风,Scream 只支持作为音频输出设备,没法把接收器连接的耳机的麦克风采集到的音频传回 Windows 上。当然肯定有些奇技淫巧可以把麦克风采集到的音频转发回 Windows,比如在 Linux 上用 FFmpeg 开一个音频流,在 Windows 上用 VLC 播放并输出到 VB-Cables,但是这总归是非常麻烦的操作。还有耳机的 AVRCP 音频控制,Scream 现在也没法转发 AVRCP 操作,想要调整音量、切歌什么的操作只能在 Windows 上进行。

心得和体会(?

这篇博文写下来颇有一种电赛论文的感觉:不断搜索和尝试,最后从在一堆不完美的方案里选出那个操作起来最复杂但可能是唯一能用的方案。我最后选择的是「使用 Linux 搭建 Scream 接收器」的方案,用树莓派 3B+ 实现的,自己平时要用蓝牙鼠标,不可能把整个蓝牙适配器都传进虚拟机,而且虚拟机也要占用电脑上的计算资源。树莓派放在宿舍也是 24 小时开机吃灰,正好借此机会让它发光发热(LED 发光和 CPU 发热)。不过我在宿舍遇到的网络问题比较严重,时不时耳机里的声音就会卡一下,就比较难受。希望 Scream 早日支持 24-bit 采样深度?

顺便提醒一下同样想使用树莓派实现这个方案的朋友,虽然 Raspberry Pi OS with Desktop 从 2020 年 12 月 4 日发布的版本开始使用 PulseAudio 作为默认的音频服务器,但是 Raspberry Pi OS Lite 仍然在使用裸的 ALSA,要想支持 LDAC 的话必须自己安装 PulseAudio 或者 PipeWire。而目前支持 LDAC 和 aptX 的新版本 PulseAudio(15.0+)和 PipeWire(0.3.18+)在 Debian 上仍然是 unstable 的包,安装起来相对麻烦。所以这边建议不要使用 Raspberry Pi OS Lite,除非你喜欢折腾。

本来还想试试把麦克风采集到的声音从树莓派传回 Windows 电脑,结果还是摸了,毕竟一般需要用到麦克风的场景也就是语音通话什么的,本身输出的音质就没那么高,AAC 就够用了。

参考链接

This article was last updated on days ago, and the information described in the article may have changed.