Snapcast
Synchronous audio player(同步音频播放)
Snapcast不是一个独立的播放器,而是一个基于CS架构用于多房间音频完美同步,达到类似Sonos公司产品多房间效果的解决方案。
在服务端,使用/tmp/snapfifo
管道用于音频输入,提供给这个管道的任何音频数据都会发送到已连接的所有客户端。最典型的使用方式就是结合
MPD 或 Mopidy 来使用,仅仅只需要在它们的配置文件中使用/tmp/snapfifo
来作为音频输出。
它是如何工作的
Snap服务端从/tmp/snapfifo
读取PCM数据块,每个数据块都用本地时间编码和标记,支持的编码方式如下:
- PCM 无损未压缩
- FLAC 无损压缩 [默认]
- Vorbis 有损压缩
编码的数据块通过TCP传输协议发送致Snap客户端。
每个客户端持续和服务器保持时间同步,因此,每个客户端均知道服务器的本地时间。
每个收到的数据块第一时间被解码并加入到客户端的数据块缓冲区。知道服务器的时间,ALSA(高级Linux声音架构的简称)就可以在适当的时间播放数据块。并且可以使用如下方式来修正时间偏移:
- 跳过部分或全部数据块
- 静音播放
- 慢速或快速播放
通常时间偏移小于1ms。
安装
你既可以使用源码来构建和安装,也可以直接在debian系统上安装.deb包
使用源码安装
请依照 guide 来构建如下不同平台的Snapcast
使用debian安装包
从Snapcast最新下载符合你的CPU架构的debian安装包,例如:
Raspberry平台
安装
$ sudo dpkg -i snapclient_0.x.x_armhf.deb
安装缺失的依赖项
$ sudo apt-get -f install
OpenWrt平台
$ opkg install snapclient_0.x.x_ar71xx.ipk
配置
安装后,使用配置在/etc/default/snapserver
和 /etc/default/snapclient
的命令行参数来启动Snap服务端和客户端,
可以使用(man snapserver
, man snapclient
)来罗列可使用命令,或者使用 -h
选项
可以使用 -s
选项来配置不同的媒体流,例如:
SNAPSERVER_OPTS="-d -s pipe:///tmp/snapfifo?name=Radio&sampleformat=48000:16:2&codec=flac -s file:///home/user/Musik/Some%20wave%20file.wav?name=File"
可以使用 (-s pipe
) 来默认创建管道。有些音频源坚持自己创建管道,因此管道模式可以改为读取模式,mode
选项可以设置为 create
或者 read
:
SNAPSERVER_OPTS="-d -s pipe:///tmp/snapfifo?name=Radio&mode=read"
测试
你可以拷贝随机数据到服务器的fifo文件中来测试安装是否成功
$ sudo cat /dev/urandom > /tmp/snapfifo
所有的已连接客户端都应该播放同样的随机噪音出来,你可以使用alsamixer
来配置客户端的音量。
当然,你也可以让服务器播放一段音频文件来测试,简单的在/etc/default/snapserver
文件中配置下 file
并且重启服务就可以了:
SNAPSERVER_OPTS="-d -s file:///home/user/Musik/Some%20wave%20file.wav?name=test"
当你使用树莓派平台时,你不得不使用3.5mm的耳机接口来作为音频输出:
#最后一个数字代表输出端口: 1代表 3.5mm 耳机接口, 2 代表HDMI , 0 代表自动.
$ amixer cset numid=3 1
你可以依据如下教程来配置树莓派的wifi: https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
控制
Snapcast可以使用JSON-RPC来控制:
- 设置客户端的音量
- 使客户端静音
- 恢复客户端播放
- 为每个客户端的指定音频流
- …
音频服务器设置
Snapcast可以使用多个不同的播放器和服务器,当然也可以集成至你任意喜爱的音频播放方案中,使你获得多房间的功能,唯一的要求就是使用的音频播放器的音频信号可以重定向到Snap服务器/tmp/snapfifo
管道文件。
使用Volumio 或 RuneAudio 或 Pi MusicBox (Mopidy)的播放器方案可以参考MPD 和 Mopidy 的配置
最终的目标是构建如下流程:
audio player software -> snapfifo -> snapserver -> network -> snapclient -> alsa
guide 是指导如何配置不同的播放器音频流重定向音频信号到Snap服务器的fifo管道:
路标
V1.0版本即将实现的功能
- Remote control JSON-RPC API to change client latency, volume, zone, …
- Android client JSON-RPC client and Snapclient
- Zones Support multiple streams
- Debian packages prebuild deb packages
- Endian independent code
- OpenWrt port Snapclient to OpenWrt
- Hi-Res audio support (like 192kHz 24bit)
- JSON-RPC Possibility to add, remove, rename streams
- Protocol specification Snapcast binary streaming protocol, JSON-RPC protocol
- Ports Snapclient for Windows, Mac OS X, …