使用 NAS,让家中的音箱轻松支持 AirPlay
bigegpt 2024-10-04 13:59 3 浏览
相比在路上使用耳机「拘束」着欣赏音乐,在家中因为空间和环境上的变化,听音乐的「姿势」也比以往要自由得多。空间允许的话,我在家听音乐都会接上「电脑音箱」,后面还非常时髦地用上无线音箱(当然这里说的是类似蓝牙音箱或者 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 上音频推送到电脑桌面一致,系统开销变大(开了一台虚拟机);另一方面就是软件稳定性上,存在延迟卡顿等问题,当然如果有条件的话,还是选择硬件解决方案算是真正的一劳永逸吧。
相关推荐
- C#.NET Autofac 详解(c# autoit)
-
简介Autofac是一个成熟的、功能丰富的.NET依赖注入(DI)容器。相比于内置容器,它额外提供:模块化注册、装饰器(Decorator)、拦截器(Interceptor)、强o的属性/方法注...
- webapi 全流程(webapi怎么部署)
-
C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...
- .NET外挂系列:3. 了解 harmony 中灵活的纯手工注入方式
-
一:背景1.讲故事上一篇我们讲到了注解特性,harmony在内部提供了20个HarmonyPatch重载方法尽可能的让大家满足业务开发,那时候我也说了,特性虽然简单粗暴,但只能解决95%...
- C# 使用SemanticKernel调用本地大模型deepseek
-
一、先使用ollama部署好deepseek大模型。具体部署请看前面的头条使用ollama进行本地化部署deepseek大模型二、创建一个空的控制台dotnetnewconsole//添加依赖...
- C#.NET 中间件详解(.net core中间件use和run)
-
简介中间件(Middleware)是ASP.NETCore的核心组件,用于处理HTTP请求和响应的管道机制。它是基于管道模型的轻量级、模块化设计,允许开发者在请求处理过程中插入自定义逻辑。...
- IoC 自动注入:让依赖注册不再重复劳动
-
在ASP.NETCore中,IoC(控制反转)功能通过依赖注入(DI)实现。ASP.NETCore有一个内置的依赖注入容器,可以自动完成依赖注入。我们可以结合反射、特性或程序集扫描来实现自动...
- C#.NET 依赖注入详解(c#依赖注入的三种方式)
-
简介在C#.NET中,依赖注入(DependencyInjection,简称DI)是一种设计模式,用于实现控制反转(InversionofControl,IoC),以降低代码耦合、提高可...
- C#从零开始实现一个特性的自动注入功能
-
在现代软件开发中,依赖注入(DependencyInjection,DI)是实现松耦合、模块化和可测试代码的一个重要实践。C#提供了优秀的DI容器,如ASP.NETCore中自带的Micr...
- C#.NET 仓储模式详解(c#仓库货物管理系统)
-
简介仓储模式(RepositoryPattern)是一种数据访问抽象模式,它在领域模型和数据访问层之间创建了一个隔离层,使得领域模型无需直接与数据访问逻辑交互。仓储模式的核心思想是将数据访问逻辑封装...
- C#.NET 泛型详解(c# 泛型 滥用)
-
简介泛型(Generics)是指在类型或方法定义时使用类型参数,以实现类型安全、可重用和高性能的数据结构与算法为什么需要泛型类型安全防止“装箱/拆箱”带来的性能损耗,并在编译时检测类型错误。可重用同一...
- 数据分析-相关性分析(相关性 分析)
-
相关性分析是一种统计方法,用于衡量两个或多个变量之间的关系强度和方向。它通过计算相关系数来量化变量间的线性关系,从而帮助理解变量之间的相互影响。相关性分析常用于数据探索和假设检验,是数据分析和统计建模...
- geom_smooth()函数-R语言ggplot2快速入门18
-
在每节,先运行以下这几行程序。library(ggplot2)library(ggpubr)library(ggtext)#用于个性化图表library(dplyr)#用于数据处理p...
- 规范申报易错要素解析(规范申报易错要素解析)
-
为什么要规范申报?规范申报是以满足海关监管、征税、统计等工作为目的,纳税义务人及其代理人依法向海关如实申报的行为,也是海关审接单环节依法监管的重要工作。企业申报的内容须符合《中华人民共和国海关进出口货...
- 「Eurora」海关编码归类 全球海关编码查询 关务服务
-
海关编码是什么? 海关编码即HS编码,为编码协调制度的简称。 其全称为《商品名称及编码协调制度的国际公约》(InternationalConventionforHarmonizedCo...
- 9月1日起,河南省税务部门对豆制品加工业试行新政7类豆制品均适用投入产出法
-
全媒体记者杨晓川报道9月2日,记者从税务部门获悉,为减轻纳税人税收负担,完善农产品增值税进项税额抵扣机制,根据相关规定,结合我省实际情况,经广泛调查研究和征求意见,从9月1日起,我省税务部门对豆制品...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)