使用 NAS,让家中的音箱轻松支持 AirPlay
相比在路上使用耳机「拘束」着欣赏音乐,在家中因为空间和环境上的变化,听音乐的「姿势」也比以往要自由得多。空间允许的话,我在家听音乐都会接上「电脑音箱」,后面还非常时髦地用上无线音箱(当然这里说的是类似蓝牙音箱或者 Sonos 音箱)。虽然在家听歌已经可以非常方便地通过蓝牙链接的方式将手机和音箱连接,但从方便度上都没有 AirPlay 那么顺滑——无需蓝牙连接那样需要配对,在 AirPlay 找到对应的设备选择就可以出声。
这么方便的音乐欣赏新姿势我竟然都无福消受,原因就是我家中那些传统的音箱都不支持 AirPlay,甚至我的 Sonos Play 1 也不在 AirPlay 支持之列,思来想去决定想办法折腾一下让他们都能支持 AirPlay ——我的目光聚焦到了家里这台「万能」的 NAS:要不通过 NAS 来作为 AIrPlay 服务中转站从而间接地让旧音箱也可以支持 AirPlay?
从最简单的做起:将老 Sonos 音箱转成 AirPlay
万事开头难,只要肯放弃,我首先将「折腾」目标转向了我的这台 Sonos Play 1,这款定位入门级的 Sonos 音箱当然是网络音箱——你可以在 DLNA 设备里面看到这款音箱,但唯独就是不支持 AirPlay(后面的 AirPlay 2 那更不用想了),当然有了 NAS 作为中转站就简单多,因为这里有针对 NAS 的现成的解决方案,就是将这些老版本(入门版)Sonos 转成 AirPlay 音箱。
还是用家中的群晖做例子,实现上其实只需要添加一个第三方的套件并启用即可,这里首先是打开群晖的「套件中心」。
点击右上方的「设置」,在「常规」选项卡中找到「信任层级」,然后选择「任何发行者」并点击确定。
使用浏览器访问 AirConnect 这个 GitHub 项目,根据你的群晖 CPU 架构下载对应的构建包(我的群晖是 X86-64 架构)。
然后回到群晖的套件中心,点击「手动安装」并选择刚才下载的构建包一路 Next 即可,需要注意的是 AirConnect 并没有独立的 GUI 界面(其实就是一个运行脚本的集合),因此安装完毕之后在传统的应用主菜单中是看不到 AirConnect 应用图标。因此是否正常运行只有一个方法:在「套件中心」的「已安装」来点击启动来运行。
之后重启你的 NAS,接下来就是见证奇迹的时刻了:打开 iOS 或者 Mac 上的音乐 App,点击播放界面中的「隔空播放」按钮,如果设置没啥问题,应该就可以看到列表中出现了以 Sonos 音响名命名的 AirPlay 播放器了 。
点击这个「伪造出的 AirPlay」然后等待一下就能出声音了,其实你也发现了它存在的一个小小的 Bug :因为通过 NAS 转换,因此相比纯原生实现的 AirPlay 播放器存在一到两秒的操作延迟。
将 NAS 上的 USB 音箱转成 AirPlay 播放器
我把 NAS 打造成了家用的媒体播放器,因此我通过一个 USB DAC 将传统的 3.5mm 有源音箱连接到 NAS 上,从而实现了通过手机 App 来遥控播放 NAS 中保存的数字音乐。但这个音乐欣赏方案存在一定的局限性,比如说只能播放本地的音乐,而不能利用他来播放流媒体,当然也就无法实现类似 AirPlay 的推播效果。
当然,如果通过 NAS 作为「转换平台」,也可以通过软件的方式来实现将传统的音箱转换成 AirPlay 播放器,而我尝试了一下三种形式来实现。
使用 Shairport Sync 的 Docker 镜像
我首先考虑的是通过相对比较「一键」傻瓜式的解决方案,然后找到了这个名为 Shairport Sync 的工具包,基于 Linux 或者 macOS,可以将设备中的音频设备转成 AirPlay 输出工具,并且考虑到要通过最小的硬件开销成本来实现并保证一定的环境隔离,Docker 运行肯定最为方便。
但最终试下来就是无法成功,一方面是群晖的 Docker 组件不支持调用外设(需在命令行下进行操作),且 Shairport Sync 的部分使用的端口和 DSM 的管理端口冲突(均使用了 5000 端口),不得已因此最终放弃了该方法。
通过 Linux 虚拟机运行 Shairport Sync
直接在 Docker 上运行存在端口冲突等问题,那么使用虚拟机来实现肯定能避坑,一方面虚机有独立的 IP 和端口,避免冲突,另一方面则是群晖 VMM 可以实现将真实的 USB 硬件直通到虚拟机中,这样配置起来调用起来也更简单。
即便你可以识别音频设备,启动服务仍然复杂繁琐
但实际配置后发现,Shairport Sync 的安装并不简单,不少发行版并不支持直接从源上安装,并且安装后还需要针对硬件进行配置上的重新设置,改到后面都没办法确定 USB 音频是否可以在我选择的发行版上正常驱动,加上大量的包以及依赖的安装使得解决方案异常复杂,最终选择放弃了该方案。
通过 Windows 虚拟机运行 Airserver
如果把 NAS 当作一台电脑,加上 USB DAC 其实就和传统的桌面电脑一样,这使得我想起以前在 Windows 上有类似的应用可以将本机变成一个 AirPlay 服务器。因此我想到了在 NAS 上创建一个 Windows 虚拟机来实现类似的功能,加上 VMM 支持硬件直通,可以直接向虚拟机暴露真实 USB 硬件,而我的 USB DAC 在 Windows 上完全免驱,因此我最终选择了该方案来实现。
首先打开群晖的 VMM 来「新建虚拟机」,选择「Windows」虚拟机,并在「其他设置」中设置 USB 为 「USB 2.0」(Windows 7 对于 USB 3.0 支持存在缺陷),并选择免驱的「USB DAC」设备,之后就是创建 Windows 虚拟机以及安装系统的步骤,尤其是需要确保 USB 音频设备可以正常驱动。
之后的步骤就是在 Windows 虚拟机中安装 AirServer 并开启服务, 需要注意的是需要为虚机开启网络设备分享。
后面再打开 iOS 或者 Mac 并打开音乐 App,在「隔空播放」中就可以看到通过 AirServer 创建的 AirPlay 音箱了,选中后连接在 NAS 上的音箱就能听到声音了。
总结
一系列的折腾下来,我终于把家中的老款 Sonos 音箱以及传统的非网络音箱转变成了 AirPlay 播放器,这在一定程度上满足了我想随时将音乐「推到」音箱上的愿望,但总的来说这样的解决方案还是不够完美——一方面是传统音箱上最终解决方案和桌面设备上将 iPhone 上音频推送到电脑桌面一致,系统开销变大(开了一台虚拟机);另一方面就是软件稳定性上,存在延迟卡顿等问题,当然如果有条件的话,还是选择硬件解决方案算是真正的一劳永逸吧。