(原创)Snapcast介绍翻译

2016/10/17 网络协议

Snapcast

Synchronous audio player(同步音频播放)

Snapcast不是一个独立的播放器,而是一个基于CS架构用于多房间音频完美同步,达到类似Sonos公司产品多房间效果的解决方案。

在服务端,使用/tmp/snapfifo管道用于音频输入,提供给这个管道的任何音频数据都会发送到已连接的所有客户端。最典型的使用方式就是结合 MPDMopidy 来使用,仅仅只需要在它们的配置文件中使用/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管道文件。

使用VolumioRuneAudioPi MusicBox (Mopidy)的播放器方案可以参考MPDMopidy 的配置

最终的目标是构建如下流程:

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, …

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

站内搜索

    撩我备注-博客

    joinee

    目录结构