Snapcast 0.35.0 配置参数详解
Snapcast 0.35.0 配置参数逐段详解:官方默认配置全文、-hh 默认值总览、七类音源 URI、buffer/codec 调节规律、snapclient 全参数要点与两套生产模板。
Snapcast 0.35.0 配置参数详解
目标:逐段吃透
/etc/snapserver.conf全部配置段(server/stream/ssl/tcp-streaming/tcp-control/http/streaming_client/logging)与 snapclient 全部命令行参数的默认值与生效行为,并给出两套可直接落地的生产配置模板。已在 Debian 12(x86_64)实测 Snapcast 0.35.0 全部参数段。
一、环境信息
本文所有参数与回显均在以下实测环境采集:
- 操作系统:Debian GNU/Linux 12 (bookworm)
- 架构:x86_64
- Snapserver / Snapclient:v0.35.0 (rev f1237347),deb 安装
- 配置文件:
/etc/snapserver.conf(deb 默认路径,随包分发) - 服务端口:1704(流)/ 1705(TCP 控制台)/ 1780(HTTP 控制台)
- 溯源数据日期:2026-10-30
二、前置条件
- 已按 deb 方式安装 snapserver(
apt-get install -y ./snapserver_0.35.0-1_amd64_bookworm.deb),版本验证回显:
snapserver v0.35.0 (rev f1237347)
- deb 随包分发的默认配置文件与相关路径(
dpkg -L snapserver节选,实测):
/etc/default/snapserver
/etc/snapserver.conf
/lib/systemd/system/snapserver.service
/usr/bin/snapserver
/usr/share/snapserver/plug-ins/meta_go-librespot.py
/usr/share/snapserver/plug-ins/meta_librespot-java.py
/usr/share/snapserver/plug-ins/meta_mopidy.py
/usr/share/snapserver/plug-ins/meta_mpd.py
/usr/share/snapserver/sandbox
/usr/share/snapserver/snapweb/index.html
三、参数查看与修改方式
3.1 配置文件 /etc/snapserver.conf
deb 默认配置共 248 行,所有值以注释形式给出默认值,去掉注释即生效。官方默认文件全文(实测原样提取,default values are commented):
[server]
#threads = -1
#pidfile = /var/run/snapserver/pid
#user = snapserver
#group = snapserver
#datadir =
[ssl]
#certificate =
#certificate_key =
#key_password =
#verify_clients = false
#client_cert =
#client_cert =
[http]
#enabled = true
#bind_to_address = ::
#port = 1780
#publish_http = true
#ssl_enabled = false
#ssl_bind_to_address = ::
#ssl_port = 1788
#publish_https = true
doc_root = /usr/share/snapserver/snapweb
#host = <hostname>
#url_prefix = https://<hostname>
[tcp-control]
#enabled = true
#bind_to_address = ::
#port = 1705
#publish = true
[tcp-streaming]
#enabled = true
#bind_to_address = ::
#port = 1704
#publish = true
[stream]
source = pipe:///tmp/snapfifo?name=default
# default_source = default
#plugin_dir = /usr/share/snapserver/plug-ins
#sandbox_dir = /usr/share/snapserver/sandbox
#sampleformat = 48000:16:2
#codec = flac
#chunk_ms = 20
#buffer = 1000
#send_to_muted = false
[streaming_client]
#initial_volume = 100
[logging]
#sink =
#filter = *:info
💡 说明:上表为去掉注释与空行后的有效行集合(与 248 行原文件逐行对应);唯一默认未注释的键是
[http] doc_root(指向内置 Snapweb 网页控制台)与[stream] source(默认 pipe 源)。bind_to_address = ::表示 IPv6 双栈监听(IPv4 映射地址同样生效)。
3.2 命令行覆盖 --<section>.<name>=<value>
配置文件里每个键都有等价命令行形式,格式 --<section>.<name>=<value>,命令行优先于配置文件。官方默认配置文件头部的说明原文:
# Settings can be overwritten on command line with:
# "--<section>.<name>=<value>", e.g. --server.threads=4
systemd 场景修改配置建议直接改 /etc/snapserver.conf(snapserver.service 经 EnvironmentFile=/etc/default/snapserver 透传 $SNAPSERVER_OPTS,也可在 /etc/default/snapserver 里追加命令行覆盖),改完重启生效:
systemctl restart snapserver
3.3 查看生效参数:-hh 与 JSON-RPC
-hh 会把配置文件全部选项连同真实默认值打印出来(snapserver -hh 输出节选,实测):
Allowed options
-h, --help Produce help message, use -hh to show options from config file
-v, --version Show version number
-d, --daemon [=arg(=0)] Daemonize
optional process priority [-20..19]
-c, --config arg (=/etc/snapserver.conf)
Path to the configuration file
Overridable config file options
--server.threads arg (=-1) number of server threads
--server.pidfile arg (=/var/run/snapserver/pid)
pid file when running as daemon
--server.user arg (=snapserver) the user to run as when daemonized
--server.datadir [=arg(=)] directory where persistent data is stored
--server.mdns_enabled arg (=1) enable mDNS to publish services
--http.enabled arg (=1) enable HTTP Json RPC (HTTP POST and websockets)
--http.port arg (=1780) which port the server should listen on
--tcp-control.port arg (=1705) which control port the server should listen on
--tcp-streaming.port arg (=1704) which streaming port the server should listen on
--stream.source arg (=pipe:///tmp/snapfifo?name=default)
URI of the PCM input stream.
Format: TYPE://host/path?name=NAME
[&codec=CODEC]
[&sampleformat=SAMPLEFORMAT]
--stream.sampleformat arg (=48000:16:2)
Default sample format
--stream.codec arg (=flac) Default transport codec
(flac|ogg|opus|pcm)[:options]
--stream.chunk_ms arg (=20) Default stream read chunk size [ms]
--stream.buffer arg (=1000) Buffer [ms]
--stream.send_to_muted arg (=0) Send audio to muted clients
--streaming_client.initial_volume arg (=100)
Volume [percent] assigned to new streaming clients
--logging.filter arg (=*:info) log filter <tag>:<level>[,<tag>:<level>]*
运行中的流参数(codec/sampleformat/chunk_ms 的实际生效值)经 JSON-RPC 查询最直接(实测):
curl -s http://127.0.0.1:1780/jsonrpc -H 'Content-Type: application/json' \
-d '{"id":1,"jsonrpc":"2.0","method":"Server.GetStatus"}'
"streams": [
{
"id": "SineTest",
"status": "playing",
"uri": {
"query": {
"chunk_ms": "20",
"codec": "pcm",
"name": "SineTest",
"sampleformat": "44100:16:2"
},
"raw": "pipe:///serverdata/snapfifo?chunk_ms=20&codec=pcm&name=SineTest&sampleformat=44100%3A16%3A2",
"scheme": "pipe"
}
}
]
四、参数总览
按配置段汇总全部参数与默认值(默认值取自 snapserver -hh 实测输出):
| 段 | 参数 | 默认值 | 作用一句话 |
|---|---|---|---|
| server | threads | -1 | 工作线程数(<0 按核数自适应:2 或 4) |
| server | pidfile | /var/run/snapserver/pid | 守护模式 pid 文件 |
| server | user / group | snapserver / snapserver | 守护模式降权运行账号 |
| server | datadir | (空=按运行模式推导) | server.json 持久化目录 |
| server | mdns_enabled | true | mDNS 服务发布开关 |
| ssl | certificate / certificate_key | (空) | TLS 证书与私钥(PEM) |
| ssl | key_password | (空) | 私钥解密口令 |
| ssl | verify_clients | false | 是否校验客户端证书 |
| ssl | client_cert | (空,可多次) | 客户端 CA 列表 |
| http | enabled / port | true / 1780 | HTTP JSON-RPC + WebSocket |
| http | bind_to_address | :: | 监听地址(可多次) |
| http | ssl_enabled / ssl_port | false / 1788 | HTTPS 控制面 |
| http | doc_root | (注释态;deb 默认 /usr/share/snapserver/snapweb) | 静态网站根目录(Snapweb) |
| http | host / url_prefix | <hostname> / (空) | 封面图外链主机名 / 反代 URL 前缀 |
| http | publish_http / publish_https | true / true | mDNS 发布开关 |
| tcp-control | enabled / port | true / 1705 | TCP JSON-RPC 控制台 |
| tcp-streaming | enabled / port | true / 1704 | 音频流分发端口 |
| stream | source | pipe:///tmp/snapfifo?name=default | 音源 URI(可配置多行) |
| stream | default_source | (首个非 meta 源) | 新客户端默认接入流 |
| stream | plugin_dir / sandbox_dir | /usr/share/snapserver/plug-ins · /sandbox | meta 插件与可执行源沙箱目录 |
| stream | sampleformat | 48000:16:2 | 默认采样格式 |
| stream | codec | flac | 默认传输编码 |
| stream | chunk_ms | 20 | 源读取/编码时间片(ms) |
| stream | buffer | 1000 | 端到端同步缓冲(ms) |
| stream | send_to_muted | false | 静音客户端是否仍推流 |
| streaming_client | initial_volume | 100 | 新客户端初始音量 |
| logging | sink | (空=daemon 用 system,前台用 stdout) | 日志出口 |
| logging | filter | *:info | 日志级别过滤 |
关键差异解读:三个「行为分水岭」参数是 buffer(同步时延)、codec(CPU/带宽权衡)、source(音源拓扑),其余多为监听面与安全面开关;先定这三者,再按需调其余。
五、核心参数分类详解
5.1 [server] 服务基础段
threads = -1:附加工作线程数。官方注释明确:小于 0 时按 CPU 核数自适应(单核/双核用 2,四核及以上用 4);设 0 仅用主线程,多流并行编码时可能掉音。4 核以上服务器默认即可,无需修改。datadir:server.json(客户端拓扑持久化)所在目录。留空时按运行模式推导——守护模式/var/lib/snapserver/,前台模式$HOME/.config/snapserver/(官方注释原文)。建议显式指定并纳入备份/挂载,实测未持久化该目录时,服务端重建后客户端命名/音量/分组全部丢失。mdns_enabled = true:通过 Avahi/Bonjour 发布_snapcast._tcp等服务,客户端可零配置发现。无 avahi 守护进程的环境(如精简系统)会在日志报[Error] (Avahi) Failed to create client: Daemon not running(实测原文),不影响 TCP 直连,可设false消除报错。user/group/pidfile:仅守护模式(-d)生效;systemd 托管时由单元文件接管(User=snapserver),无需配置。
5.2 [stream] 流与音源段(核心)
source:每行定义一个流,格式与全部类型(官方默认配置注释原文):
# Format: TYPE://host/path?name=<name>[&codec=<codec>][&sampleformat=<sampleformat>][&chunk_ms=<chunk ms>][&controlscript=<control script filename>[&controlscriptparams=<control script command line arguments>]]
# pipe: pipe:///<path/to/pipe>?name=<name>[&mode=create], mode can be "create" or "read"
# librespot: librespot:///<path/to/librespot>?name=<name>[&username=<my username>&password=<my password>][&devicename=Snapcast][&bitrate=320][&wd_timeout=7800][&volume=100][&onevent=""][&normalize=false][&autoplay=false][¶ms=<generic librepsot process arguments>]
# file: file:///<path/to/PCM/file>?name=<name>
# process: process:///<path/to/process>?name=<name>[&wd_timeout=0][&log_stderr=false][¶ms=<process arguments>]
# airplay: airplay:///<path/to/airplay>?name=<name>[&port=5000]
# tcp server: tcp://<listen IP, e.g. 127.0.0.1>:<port>?name=<name>[&mode=server]
# tcp client: tcp://<server IP, e.g. 127.0.0.1>:<port>?name=<name>&mode=client
# alsa: alsa:///?name=<name>&device=<alsa device>[&send_silence=false][&idle_threshold=100][&silence_threshold_percent=0.0]
# meta: meta:///<name of source#1>/<name of source#2>/.../<name of source#N>?name=<name>
七类源选型要点(本文实测采用 pipe):
pipe:命名管道,最通用——MPD 的 pipe 输出、脚本生成器、系统音频 loopback 都往里写;mode=create(默认)服务器自动建管道,mode=read要求管道已存在;file:读 PCM 裸文件做测试源;process:把子进程 stdout 当 PCM 流(如process:///usr/bin/someplayer?name=X¶ms=-b 320);librespot:内嵌 Spotify Connect(需 librespot 二进制,强制 44100:16:2);airplay:内嵌 AirPlay 接收(需配套二进制);tcp:server 模式监听端口收流、client 模式拉远端流,适合跨机中继;meta:把多个具名流聚合为一个可切换的虚拟流(多上游共存的标准做法,插件脚本在plugin_dir)。
sampleformat:<采样率>:<位深>:<声道>,默认 48000:16:2。源侧格式不同时由服务器统一到该格式;与上游输出格式保持一致可避免重采样损失。
codec:默认 flac。四选对比与专属参数实测(snapserver --stream.codec=<codec>:?):
== codec=flac options ==
Options for codec 'flac':
compression level: [0..8]
Default: '2'
== codec=ogg options ==
Options for codec 'ogg':
VBR:[-0.1 - 1.0]
Default: 'VBR:0.9'
== codec=opus options ==
Options for codec 'opus':
BITRATE:[6000 - 512000|MAX|AUTO],COMPLEXITY:[1-10]
Default: 'BITRATE:192000,COMPLEXITY:10'
== codec=pcm options ==
Options for codec 'pcm':
No codec options supported
Default: ''
💡 技术拓展:传输 codec 四选对比——
codec 压缩性质 CPU 典型码率 适用场景 pcm 无压缩 最低 44100×16×2 ≈ 1.4 Mbps 内网带宽富余、追求零编码开销 flac 无损压缩 低 约压缩到 50-70% 默认选择,音质无损(官方默认) ogg 有损 VBR 中 质量档 0.9 约 160-200 kbps 带宽受限 opus 有损 中 192 kbps 默认,可低至 6 kbps 低带宽 Wi-Fi、嵌入式客户端 本文实测环境(千兆内网、零编码开销需求)用
codec = pcm;一般家庭环境保持默认flac。写法带专属参数示例:codec = flac:3(压缩级别 3)。
chunk_ms:从源读取并编码的时间片,默认 20ms。官方注释特别提醒部分编码需要更大块(原文:e.g. Flac will need ~26ms chunks)——用 flac 时保持默认即可,服务器自动满足;调小可降时延但增大每秒请求数。
buffer:端到端同步缓冲,官方注释定义原文「The end-to-end latency, from capturing a sample on the server until the sample is played-out on the client」,默认 1000ms。调节规律:
- 网络抖动大(Wi-Fi 拥塞、跨交换机)→ 调大到 1500-2000ms,抗抖动更强;
- 追求切歌/调音量响应快 → 降到 400-800ms,网络需稳定;
- 客户端日志出现
abs(age > 500)类缓冲告警(实测原文形态)即提示缓冲不足或源断流。
send_to_muted:默认 false——静音客户端不推流省带宽;true 则静音客户端也接收数据(切回有声零等待,代价是持续占用带宽与编码 CPU)。
default_source:新接入客户端默认加入的流名;不设则取第一个非 meta 源(官方注释)。
5.3 [streaming_client] 段
initial_volume = 100:新客户端接入时的初始音量百分比。全屋场景建议保持 100(由控制端统一管理音量);夜间场景可降到 50 防止新设备突然大声。
5.4 [tcp-streaming] / [tcp-control] 段
tcp-streaming(1704):音频分发面,只服务 snapclient;bind_to_address建议生产环境绑定内网网卡地址(可多次指定);tcp-control(1705):TCP JSON-RPC 控制面,每行一个请求。实测一次(裸 TCP 直发):
{"id":1,"jsonrpc":"2.0","method":"Server.GetRPCVersion"}
{"id":1,"jsonrpc":"2.0","result":{"major":23,"minor":0,"patch":0}}
- 两者都有
publish开关(mDNS 发布),纯静态环境可关闭。
5.5 [http] 段
enabled/port:HTTP JSON-RPC(POST 与 WebSocket 同端口),默认 1780;doc_root:deb 默认已指向/usr/share/snapserver/snapweb,浏览器访问http://<server>:1780/即 Snapweb 控制台(分组/音量/切流全可视化)。改为自定义站点目录即托管自己的前端;删除该行则回退内置默认页(实测返回HTTP/1.1 200 OK+Server: Snapcast);ssl_enabled/ssl_port(1788):HTTPS 控制面,配合[ssl]段证书使用;host/url_prefix:封面图外链的可达主机名与反代前缀,仅在把 Snapweb/API 暴露给外部域名时需要配置。
5.6 [ssl] 段
certificate/certificate_key(PEM 格式)为最小配置;verify_clients = true 后须用 client_cert(可多次)提供受信 CA 列表,实现双向认证。证书相对路径在当前目录与 /etc/snapserver/certs/ 中查找(官方注释)。公网暴露前:HTTP 换 HTTPS、控制面绑定 127.0.0.1 或加 [authorization](命令行 --authorization.enabled=1 --authorization.role=... --authorization.user=...,-hh 实测可见)。
5.7 [logging] 段
sink:null、system(syslog/journald)、stdout、stderr、file:<路径>五选;留空时守护模式用 system、前台用 stdout(官方注释)。systemd 托管保持默认(deb 单元已显式--logging.sink=system);filter:<tag>:<level>逗号组合,级别 trace/debug/info/notice/warning/error/fatal。排障首选*:debug(实测本文排障即用它拿到完整会话日志),日常*:info;只调某模块如Stream:debug,*:info。
5.8 snapclient 侧参数
客户端无配置文件,全部走命令行(snapclient --help 全文实测):
Usage: snapclient [options...] [url]
With 'url' = <tcp|ws|wss>://<snapserver host or IP or mDNS service name>[:port]
For example: 'tcp://192.168.1.1:1704', or 'ws://)homeserver.local' or 'wss://_snapcast-https._tcp'
If 'url' is not configured, snapclient defaults to 'tcp://_snapcast._tcp'
-i, --instance arg (=1) Instance id when running multiple instances on the same host
--hostID arg Unique host id, default is MAC address
--cert arg Client certificate file (PEM format)
--cert-key arg Client private key file (PEM format)
--key-password arg Key password (for encrypted private key file)
--server-cert [=arg(="default certificates")]
Verify server with CA certificate (PEM format)
-l, --list List PCM devices
-s, --soundcard arg (=default) Index or name of the PCM device
--latency arg (=0) Latency of the PCM device
--sampleformat arg Resample audio stream to <rate>:<bits>:<channels>
--player arg (=alsa) alsa|file[:<options>|?]
--mixer arg (=software) software|hardware|script|none|?[:<options>]
-d, --daemon [=arg(=-3)] Daemonize, optional process priority [-20..19]
--user arg The user[:group] to run snapclient as when daemonized
--logsink arg Log sink [null,system,stdout,stderr,file:<filename>]
--logfilter arg (=*:info) Log filter <tag>:<level>[,<tag>:<level>]*
逐项要点:
- url(位置参数):
tcp://<server>[:1704]生产标配;ws:///wss://走 1780/1788;不填则 mDNS 发现tcp://_snapcast._tcp; - --hostID:客户端唯一身份,默认取本机 MAC。MAC 会漂移的环境(虚拟机重建、网卡更换)必须显式固定(如
--hostID living-room),否则服务器端音量/分组配置对不上号(实测环境重建后 MAC 变化、旧配置记录失联); - --soundcard / -l:输出设备索引或名称,默认
default;无声卡环境用 ALSA null 设备验证链路(实测snapclient -l与启动日志):
0: null
Discard all samples (playback) or generate zero samples (capture)
2026-10-30 00-51-59.287 [Info] (Player) Player name: alsa, device: null, description: Discard all samples (playback) or generate zero samples (capture), idx: 0, sharing mode: unspecified, parameters: <none>
- --latency:声卡/功放链路固有延迟补偿(毫秒),默认 0;不同房间功放延迟不同时可按客户端单独补偿,也可经 JSON-RPC
Client.SetLatency在线调(实测设 10ms 回显{"latency": 10}); - --sampleformat:强制重采样到指定
<rate>:<bits>:<channels>,与服务器流格式不一致时客户端本机重采样; - --player:输出后端,默认
alsa,可选file(写文件);--player file时--soundcard参数值即输出文件路径; - --mixer:音量混合器实现,默认
software(客户端软件混音,最通用);hardware走声卡硬件混音、script自定义脚本、none禁用(音量控制失效); - --instance:同机多实例编号(一块声卡跑多路或一台机器模拟多房间时区分实例);
- --daemon/-d:守护化,默认 nice 值 -3;systemd 托管场景不需要;
- TLS 三件套:
--cert/--cert-key/--server-cert对接服务器[ssl]段的客户端证书校验。
六、生产配置模板
6.1 家庭全屋音频模板(适用:8GB 内存、百兆内网、5-10 个客户端、单 MPD 上游)
[server]
threads = -1
mdns_enabled = true
datadir = /var/lib/snapserver
[stream]
source = pipe:///tmp/snapfifo?name=Mpd&controlscript=meta_mpd.py
sampleformat = 44100:16:2
codec = flac
chunk_ms = 20
buffer = 1000
send_to_muted = false
[tcp-streaming]
enabled = true
port = 1704
[tcp-control]
enabled = true
port = 1705
bind_to_address = 192.168.1.10
[http]
enabled = true
port = 1780
bind_to_address = 192.168.1.10
doc_root = /usr/share/snapserver/snapweb
[streaming_client]
initial_volume = 100
[logging]
filter = *:info
要点:codec = flac 用默认压缩级别 2(百兆内网 10 客户端同时拉流约 10×700kbps,余量充足);控制面绑定内网 IP 避免误暴露;datadir 显式指向默认持久化路径并纳入备份;buffer 保持 1000ms 抗 Wi-Fi 抖动。
6.2 多源分区模板(适用:16GB 内存、千兆内网、客厅/书房分区 + Spotify 在线源)
[server]
threads = 4
datadir = /var/lib/snapserver
[stream]
source = pipe:///tmp/snapfifo-mpd?name=Mpd&sampleformat=44100:16:2
source = librespot:///usr/bin/librespot?name=Spotify&bitrate=320&devicename=Snapcast
source = meta:///Mpd/Spotify?name=Master
default_source = Master
sampleformat = 44100:16:2
codec = pcm
chunk_ms = 20
buffer = 1000
[tcp-streaming]
enabled = true
port = 1704
[tcp-control]
enabled = true
port = 1705
[http]
enabled = true
port = 1780
doc_root = /usr/share/snapserver/snapweb
[logging]
filter = *:info
要点:pcm 编码把 CPU 留给多流并行(千兆内网 1.4Mbps/客户端无压力);meta:///Mpd/Spotify 聚合两源为 Master 并设为默认,客户端切流在 Snapweb 里完成;threads = 4 显式给足编码线程。两套模板均已在本文实测环境逐段验证语法与监听行为。
七、常见问题
Q1:改了 /etc/snapserver.conf 不生效?
三步排查:确认改的是 /etc/snapserver.conf(snapserver -c 指定的路径优先);确认重启过服务(systemctl restart snapserver);确认没有同名命令行覆盖(/etc/default/snapserver 的 SNAPSERVER_OPTS 与 systemd 单元 ExecStart 里的参数优先级更高)。
Q2:buffer 调小后客户端频繁缓冲告警?
客户端日志形态(实测原文):
2026-10-30 00-52-03.237 [Info] (Stream) abs(age > 500): 559969
2026-10-30 00-52-03.237 [Info] (Alsa) Failed to get chunk
网络抖动超过缓冲余量,把 buffer 逐步回调(每次 +250ms)直到告警消失;同时排查 Wi-Fi 漫游/拥塞。
Q3:flac 流客户端报解码错误?
多为 chunk_ms 被改小于 20(flac 需要 ~26ms 块,官方注释原文)或 sampleformat 与源不匹配。恢复 chunk_ms = 20 并核对 sampleformat。
Q4:如何确认某流的实际生效参数?
JSON-RPC Server.GetStatus 的 streams[].uri.query(本文 3.3 实测回显),比翻配置文件可靠——它反映的是运行时真实值。
Q5:无声卡机器能当客户端吗?
能。--soundcard null(ALSA null 设备丢弃采样)即可完整验证同步链路,实测日志见 5.8;真实出声仍需声卡或 --player file 落文件检查。