快照预算多房间

多房间音频系统的创建使您可以同时实现多个目标。



  1. 在多个房间中播放相同的音频信号(背景音乐)
  2. 能够在每个房间中复制自己的音频信号
  3. 分布式分发通知的可能性(例如,门铃不是以最大音量在门附近响起,而是通过所有扬声器或某些扬声器以低音量响起)。


在本文中,我将分享一个在自己的公寓中构建多房间系统的示例。最初的想法是在所有房间中以低音量创建背景音乐(选定的广播电台),而不是在一个必须增加音量的位置上进行播放。



多房间 系统的基础是免费的Snapcast解决方案服务器部分在家用服务器上启动;连接了有源扬声器的Orange PI零小型计算机,或者安装了Kodi媒体播放器(Libreelec分销商)的功能更强大的Rasberry PI在房间中充当客户端。



成品系统的关键特征



  1. 在后台播放互联网广播电台
  2. 使用Airplay,UPnP或通过Plex播放器在多房间(或单独选择的客户端)上播放音乐的能力。有计划添加蓝牙支持,尽管这与我并不特别相关
  3. 通过Web界面从计算机播放任意内容
  4. 手动或根据时间表更改当前播放的广播电台
  5. 分配给任何来源的每个客户
  6. 音量控制是针对每个音频设备单独设置的(它的工作方式是:将自己的音频系统控件设置为最大,必要时从服务器调整每个snapclient的音量(通常也设置为最大),并且从播放源(电话)调整总体音量级别,计算机播放器或mpd)


现在,在客户端上可以轻松完成—有armbian,在其上安装了shairport和snapclient,并计划提供upmpdcli和plexamp,以便每个客户端都可以充当通用点,使用任何可能的协议来再现声音。仍然阻止此操作完成的主要问题是Linux不允许在多个程序之间共享一个ALSA音频设备,在这里您必须在通过一项服务播放声音时关闭其他ALSA音频设备,或者尝试使用Pulseaudio,这在Snapclient(Snapcast)情况下是不可能的。只能通过ALSA进行工作,因为它可以最大程度地减少延迟,因此所有来源的声音都是绝对同步的。有关更多详细信息,请参见Snapcast文档)。



服务器端被设计为微服务,形式是将多个docker容器组合成一个堆栈。最初,有计划在Swarm集群中启动容器(是的,我在家中有两台计算机组合成一个Swarm集群,该集群可运行我在家中真正需要的所有服务,但实际上并不需要),但是这个想法必须放弃,而必须通过docker-compose .yml文件在其中一台计算机上运行。可靠性当然是me脚,但对于家庭来说已经足够了。无法在群集中启动的原因是Snapcast服务器使用fifo来接收音频流(典型的链条如下所示-使用mpd播放声音,fifo是输出设备,快照服务器从中读取流并将其传输到所有客户端)。但是由于群集无法共享卷,在多个节点之间托管fifo的主机(在主机上使用fifo并使用分布式文件系统转发该fifo也不起作用。尽管可以通过nfs进行操作,但我尚未尝试过),并且也无法强制swarm集群在一个节点上运行所有容器,允许所有服务访问fifo的唯一方法是在一个节点上运行所有内容(当然,您可以制作一个虚拟机或一个巨型容器,其中所有可能的事情都是通过管理程序启动的,但我决定不这样做)。允许所有服务访问fifo的唯一方法是在一个节点上运行所有内容(当然,您可以制作一个虚拟机或一个巨型容器,其中所有可能的事情都是通过管理程序启动的,但我决定不这样做)。允许所有服务访问fifo的唯一方法是在一个节点上运行所有内容(当然,您可以制作一个虚拟机或一个大型容器,其中所有内容都通过管理程序启动,但我决定不这样做)。



堆栈组成



1)Snapserver。快照服务器容器。它在端口1704、1705和家庭网络中可用,对其的调用通过dns名称snapserver.local进行。它知道如何通过Avahi进行声明,但是在avahi docker中工作时,声明会通过一个单独的容器发布(该容器不包含在此堆栈中)。



2)Snapcastr。Snapserver Web服务。在端口5011上可用(可通过本地反向代理作为snapcastr.local使用)。



3)Snapchanger。解析音频源并将客户端切换到当前活动的最高优先级音频源的Python脚本。例如,互联网广播的优先级最低,并且总是播放。通过Airplay从手机播放音乐时,它将切换到此流,如果此时有来自智能家居的信号,它将切换到该流。当流停止时,它将切换回优先级最高的活动流。对于每个客户端,您可以为其指定线程列表和优先级。



4)Snapcron。具有cron的容器,可以在特定时间运行脚本,例如,更改客户端的音量(在晚上完全关闭卧室中的音乐)。



5)mpd。播放互联网广播的mpd实例。通过非标准端口36602转发到家庭网络



。6)无线电。 pyhthon脚本可确保始终播放广播(在某些情况下连接被中断,或者连接似乎在那里,但声音无法播放),以及根据一天中的时间切换广播电台和音量。



7-8)mpd.fm和pifi-播放广播电台的网络外壳。两块相同类型的用于实验。



9)贪心。另一个用于播放音乐的外壳(也称为单独的mpd服务器)。它充当单独的mpd服务器,并响应标准mpd端口-6600。可用于听音乐。它使用自己的流,并且与广播电台的mpd无关。



10-12)shairport-sync,upmpdcli,plexamp-具有相应客户端的容器。每个容器都使用自己的mpd实例,并写入自己的fifo。因此,每个客户端都有自己的独立流。



因此,堆栈现在支持:



  • 几个独立的声源,可以在它们之间任意选择-默认,uPnP,Mopidy,Plexamp,AirPlay和Internet广播。
  • 使用Snapcastr管理Snapcast服务器本身。
  • 一组脚本,以确保可靠且不间断的背景广播声音。
  • 使用pi-fi或mpd.fm控制广播播放(此外,我使用家庭自动化中使用的Node-red配置了对该mpd实例的控制)。


仓库链接



All Articles