将树莓派打造成 OAAT 音频端点
将树莓派打造成 bit-perfect 的 OAAT 音频端点

本指南将一步步带你把 Raspberry Pi 3B+ 或 4 配置为使用 OAAT(Open Advanced Audio Transport)协议的高保真音频端点。
OAAT 是一个开源协议,定位为 Roon 私有 RAAT 协议的开放替代方案:
- Bit-perfect 音频 —— PCM 最高 768 kHz / 32 bit,原生 DSD 最高 DSD512
- 多房间同步 —— 各端点之间误差小于 1 ms,基于 PTP 时钟
- 格式协商 —— 控制器自动适配 DAC 的能力
- 无缝播放(Gapless) —— 即使切换格式也不会中断
- 零配置 —— mDNS/DNS-SD 发现,无需输入任何 IP
- 开源 —— Apache 2.0,Rust 代码托管于 GitHub
OAAT 与其他协议的对比
- OAAT:开源、bit-perfect、原生 DSD、多房间同步小于 1 ms
- RAAT (Roon):bit-perfect、支持 DSD、多房间 —— 但私有且封闭
- DLNA/UPnP:开源 —— 但没有多房间同步,gapless 表现随机,DSD 仅支持 DoP
- AirPlay 2:Apple 多房间 —— 但非 bit-perfect,不支持 DSD,生态封闭
树莓派是理想的搭档:35-75 欧元、静音(无风扇),并带有原生 I2S 总线,可通过 GPIO 直连 DAC —— 这是最短、最纯净的音频路径。
OAAT 架构
graph LR
A["🎵 Tune Server
(контроллер)"] -->|"TCP :9740
contrôle JSON"| B["🔊 RPi Endpoint
(DAC I2S)"]
A -->|"UDP :9741
audio PCM/FLAC"| B
A <-->|"UDP :9742
clock sync PTP"| B
B -->|"I2S GPIO"| C["🎧 DAC
ESS 9038 / HifiBerry / ..."]
C --> D["🔈 Ampli + Enceintes"]
style A fill:#4a90d9,stroke:#333,color:#fff
style B fill:#50c878,stroke:#333,color:#fff
style C fill:#f5a623,stroke:#333,color:#fff
style D fill:#e8e8e8,stroke:#333,color:#333
所需硬件
树莓派
- RPi 4B(2 或 4 GB) —— 最高 PCM:384 kHz / 32 bit —— ✅ 推荐
- RPi 3B+ —— 最高 PCM:192 kHz / 32 bit —— 预算 / 二手方案
- RPi 5 —— 最高 PCM:384 kHz / 32 bit —— 同样可用
RPi 3B+ 受其 I2S 总线限制,最高只到 192 kHz。若需要更高的 hi-res(352.8 / 384 kHz),请选择 RPi 4。
I2S DAC(HAT)
OAAT 支持所有兼容树莓派的 I2S DAC。以下是最常见的几款:
- Audiophonics ESS 9038Q2M(ESS ES9038Q2M)—— 384 kHz / 32 bit —— 约 120 欧 —— overlay:
i-sabre-q2m—— Linux 驱动 - HifiBerry DAC2 HD(PCM1796)—— 192 kHz / 24 bit —— 约 65 欧 —— overlay:
hifiberry-dacplushd - HifiBerry DAC+ Pro(PCM5122)—— 192 kHz / 32 bit —— 约 45 欧 —— overlay:
hifiberry-dacplus - Allo Boss(PCM5122)—— 384 kHz / 32 bit —— 约 50 欧 —— overlay:
allo-boss-dac-pcm512x-audio - IQaudio DAC+(PCM5122)—— 192 kHz / 24 bit —— 约 30 欧 —— overlay:
iqaudio-dacplus - JustBoom DAC HAT(PCM5122)—— 384 kHz / 32 bit —— 约 35 欧 —— overlay:
justboom-dac
⚠️ 重要:Linux overlay 必须与你的 DAC 完全对应。overlay 错误 = 没有声音(ALSA 报错 -121 或 -22)。
配件
- microSD 卡:最低 8 GB(推荐 16 GB)
- 电源:树莓派官方电源或 5V/3A USB-C(RPi 4)/ micro-USB(RPi 3)
- 以太网线:为音频稳定性推荐使用(WiFi 可用,但会在时钟同步上增加约 50 ms 抖动)
- 机箱(可选):Audiophonics 提供 Pi + DAC 的一体化机箱
烧写 SD 卡
1. 安装 Raspberry Pi Imager
- macOS:
brew install --cask raspberry-pi-imager - Windows:下载安装程序
- Linux:
sudo apt install rpi-imager
2. 配置并烧写
- 打开 Raspberry Pi Imager
- 选择设备:Raspberry Pi 3 或 4
- 选择系统:
Raspberry Pi OS (other)→ Raspberry Pi OS Lite (64-bit) —— 无需桌面版 - 选择存储:你的 microSD 卡
- 点击齿轮图标(⚙️)进行配置:
- 主机名:
oaat-endpoint - 启用 SSH:是,使用密码
- 用户名 / 密码:自行设定
- WiFi:若无以太网则需配置
- 时区:
Europe/Paris
- 主机名:
- 开始烧写 —— 约 2-3 分钟
3. 首次启动
- 将 SD 卡插入树莓派
- 把 DAC HAT 装到 GPIO 上(如尚未安装)
- 接上以太网 + 电源
- 等待 1-2 分钟(首次启动稍慢)
- 通过 SSH 连接:
ssh pi@oaat-endpoint.local
小技巧:要找到树莓派的 IP,可查看路由器/光猫的管理界面,或使用 arp -a | grep raspberry。
安装
流程总览
flowchart LR
A["📥 Flash SD
RPi Imager"] --> B["🔌 Boot + SSH"]
B --> C["⚙️ setup.sh
choix du DAC"]
C --> D["🔄 Reboot"]
D --> E["✅ Endpoint actif
visible sur le réseau"]
style A fill:#e8e8e8,stroke:#333
style B fill:#e8e8e8,stroke:#333
style C fill:#f5a623,stroke:#333,color:#fff
style D fill:#e8e8e8,stroke:#333
style E fill:#50c878,stroke:#333,color:#fff
自动安装(推荐)
一条命令搞定全部:
curl -sL https://raw.githubusercontent.com/renesenses/oaat/main/dist/rpi/setup.sh | sudo bash
脚本会让你在 6 款受支持的 DAC 中选择你的型号,然后:
- 安装系统依赖(ALSA、构建工具)
- 在
/boot/config.txt中配置 DAC 的 overlay - 配置 ALSA(
/etc/asound.conf) - 安装 Rust 并从源码编译 OAAT
- 安装 systemd 服务
编译时间:
- RPi 4:release 模式约 8 分钟
- RPi 3B+:release 模式约 20 分钟(脚本会自动处理 swap)
安装完成后:
sudo reboot
重启是启用 DAC overlay 的必要步骤。重启后,OAAT 服务会自动启动。
手动安装(逐步)
如果你更愿意掌控每一步:
1. 系统依赖
sudo apt-get update
sudo apt-get install -y libasound2 libasound2-dev alsa-utils curl git build-essential pkg-config
2. 配置 DAC
编辑 /boot/firmware/config.txt(或 /boot/config.txt,取决于系统版本):
# Désactiver l'audio embarqué
#dtparam=audio=on
# Votre DAC — décommentez UNE SEULE ligne :
dtoverlay=i-sabre-q2m # Audiophonics ESS 9038Q2M
#dtoverlay=hifiberry-dacplus # HifiBerry DAC+ / DAC+ Pro
#dtoverlay=hifiberry-dacplushd # HifiBerry DAC2 HD
#dtoverlay=allo-boss-dac-pcm512x-audio # Allo Boss
#dtoverlay=iqaudio-dacplus # IQaudio DAC+
#dtoverlay=justboom-dac # JustBoom DAC HAT
3. 配置 ALSA
sudo tee /etc/asound.conf << 'EOF'
pcm.!default {
type hw
card 0
device 0
format S32_LE
}
ctl.!default {
type hw
card 0
}
EOF
4. 安装 Rust 并编译
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.cargo/env
sudo mkdir -p /opt/oaat
sudo chown $USER:$USER /opt/oaat
git clone https://github.com/renesenses/oaat.git /opt/oaat/src
cd /opt/oaat/src
cargo build --release --bin oaat
cp target/release/oaat /opt/oaat/oaat
cp dist/rpi/endpoint.toml /opt/oaat/endpoint.toml
5. systemd 服务与重启
sudo cp dist/oaat-endpoint.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable oaat-endpoint
sudo reboot
配置
配置文件位于 /opt/oaat/endpoint.toml:
[endpoint]
# Nom affiché dans Tune et lors de la découverte mDNS
name = "Salon DAC"
port = 9740
[capabilities]
# Adapter à votre DAC :
pcm_max_rate = 384000 # Hz (384000, 192000...)
pcm_max_bits = 32 # bits (32, 24)
channels_max = 2
dsd = false
flac = true # Recommandé : réduit la bande passante de ~50%
[logging]
level = "info"
建议:
pcm_max_rate:不要声明超过 DAC 实际支持的规格。若源文件规格更高,OAAT 会自动向下协商。flac = true:推荐开启,尤其在 WiFi 下。FLAC 是无损的,音质零损失,并可将带宽降低约 50-60%。name:取一个有意义的名字,它会作为播放区域显示在 Tune 中。
各 DAC 的配置示例
Audiophonics ESS 9038Q2M:
[endpoint]
name = "Audiophonics ESS 9038"
[capabilities]
pcm_max_rate = 384000
pcm_max_bits = 32
channels_max = 2
flac = true
HifiBerry DAC+ Pro / DAC2 HD:
[endpoint]
name = "HifiBerry DAC"
[capabilities]
pcm_max_rate = 192000
pcm_max_bits = 24
channels_max = 2
flac = true
Allo Boss / JustBoom:
[endpoint]
name = "Allo Boss DAC"
[capabilities]
pcm_max_rate = 384000
pcm_max_bits = 32
channels_max = 2
flac = true
Audiophonics ESS 9038Q2M —— 技术细节
ES9038Q2M 支持 S16_LE 与 S32_LE 格式,采样率最高 384 kHz(DSD 模式下甚至可达 1.536 MHz),并提供进阶 ALSA 控制项:
- 数字音量:0-100(-100 dB 至 0 dB)
- FIR 滤波器:7 种类型(brick wall、minimum phase、linear phase……)
- 输入选择:I2S / SPDIF
Linux 驱动使用 I2C 地址 0x48。在较新的 Raspberry Pi OS Bookworm 上,i-sabre-q2m overlay 通常已包含在内核中。若内核较旧,可从 Audiophonics 仓库编译模块:
sudo apt-get install -y raspberrypi-kernel-headers
git clone https://github.com/audiophonics/I-Sabre_9038Q2M.git /tmp/i-sabre
cd /tmp/i-sabre
make
sudo make install
sudo reboot
验证与首次出声
1. 确认 DAC 已被识别:
aplay -l
# Doit afficher votre DAC comme carte 0
2. 直接测试声音(不经过 OAAT):
speaker-test -D hw:0,0 -c 2 -t sine -f 440
# Vous devez entendre un la 440 Hz — Ctrl+C pour arrêter
3. 检查 OAAT 服务:
sudo systemctl status oaat-endpoint
# Active: active (running)
4. 验证 mDNS 发现(从另一台设备):
# macOS
dns-sd -B _oaat._tcp
# Linux
avahi-browse -r _oaat._tcp
5. 通过 OAAT 播放第一声!
在你的电脑上(已安装 oaat CLI):
# Sinusoïde 440 Hz pendant 5 secondes
oaat controller --target IP_DU_PI:9740 --freq 440 --duration 5
如果你听到了 440 Hz 的标准音 A:你的 OAAT 端点已经正常工作,而且是 bit-perfect 的!🎉
6. 完整一致性测试:
oaat-test IP_DU_PI:9740
# OAAT Conformance Test
# [Handshake] 4 PASS
# [Capabilities] 4 PASS
# [Format Nego] 3 PASS (accept, counter, reject)
# [Clock Sync] 1 PASS
# [Audio] 1 PASS
# [Gapless] 2 PASS (same format, diff format)
# [Volume] 3 PASS
# [Reconnect] 2 PASS
# 20 tests: 20 passed — Endpoint is CONFORMANT
配合 Tune 使用
Tune 是一个自托管音乐服务器,原生集成 OAAT。
如果 Tune 与你的树莓派在同一个局域网中,OAAT 端点会自动作为播放区域出现在 Web 界面里,无需任何额外配置。
在 Tune 中,OAAT 端点的优先级高于 DLNA 和 AirPlay,因为它提供了最直接、最忠实的音频路径。
格式协商完全透明:
- 源为 24/96,DAC 支持 384/32 → 以原生 24/96 播放(不做无意义的升采样)
- 源为 24/192,DAC 最高支持 96 → Tune 降采样到 24/96(同属 48 kHz 家族)
- 源为 DSD,DAC 不支持 DSD → 透明转换为 PCM
故障排查
没有声音
aplay -l未列出任何声卡 → DAC overlay 缺失或错误。检查/boot/firmware/config.txt,修正 overlay 后重启。speaker-test报错-121→ 该 DAC 的 overlay 不对。尝试其他 overlay(参见上文列表)。speaker-test正常但 OAAT 无声 → 服务未启动或配置有误。用systemctl status oaat-endpoint与journalctl -u oaat-endpoint -f检查。- 声音有杂音或跳帧 → WiFi 不稳定。改用以太网。
Tune 发现不到端点
- 确认 Tune 与树莓派处于同一子网
- 若使用 VPN(NordVPN 等):启用
nordvpn set lan-discovery on - 检查防火墙:端口 9740(TCP)、9741(UDP)、9742(UDP)与 5353(mDNS)必须开放
- 手动测试 mDNS 发现(见「验证」一节)
服务无法启动
# Voir les logs détaillés
journalctl -u oaat-endpoint -f
# Erreurs courantes :
# "No such device" → DAC pas détecté, vérifier overlay + reboot
# "Address already in use" → un autre processus utilise le port 9740
# "Permission denied" → vérifier le User dans le fichier service
RPi 3 与 RPi 4 对比
- I2S 最高 PCM:RPi 3B+ = 192 kHz / RPi 4 = 384 kHz
- 编译时间:RPi 3 约 20 分钟 / RPi 4 约 8 分钟
- 内存:RPi 3 = 1 GB(建议开 swap)/ RPi 4 = 2-8 GB
- 以太网:RPi 3 = 100 Mbps(经 USB)/ RPi 4 = 原生千兆
对于 16/44.1(CD)到 24/192(hi-res),RPi 3B+ 表现完全够用。如果你主要听 CD 规格的 FLAC 或 Qobuz 24/96,一台 25 欧的二手 RPi 3 完全胜任。
Audiophonics ESS 9038Q2M:找不到 overlay
在某些 Raspberry Pi OS 版本中,内核并未包含 i-sabre-q2m overlay。症状:
dtoverlay: failed to apply overlay 'i-sabre-q2m'
解决办法:从源码编译驱动(见上文「配置」一节)。
进阶
更新端点
cd /opt/oaat/src
git pull
cargo build --release --bin oaat
cp target/release/oaat /opt/oaat/oaat
sudo systemctl restart oaat-endpoint
同步的多房间播放
同一网络下的两台(或更多)树莓派可以实现小于 1 ms 的同步:
graph TD
A["🎵 Tune Server"] -->|"même PTS"| B["🔊 RPi #1 — Salon
ESS 9038Q2M"]
A -->|"même PTS"| C["🔊 RPi #2 — Cuisine
HifiBerry DAC+"]
A -->|"même PTS"| D["🔊 RPi #3 — Chambre
Allo Boss"]
B <-->|"clock sync
PTP"| A
C <-->|"clock sync
PTP"| A
D <-->|"clock sync
PTP"| A
E["⏱️ Sync < 1 ms
entre tous les endpoints"]
style A fill:#4a90d9,stroke:#333,color:#fff
style B fill:#50c878,stroke:#333,color:#fff
style C fill:#50c878,stroke:#333,color:#fff
style D fill:#50c878,stroke:#333,color:#fff
style E fill:#fff3cd,stroke:#f5a623,color:#333
每个端点收到相同的音频数据包以及相同的呈现时间戳(PTS)。PTP 同步会自动校正各树莓派之间的时钟差异。
在 Tune 中,只需创建一个包含多个端点的分组区域,即可启用多房间播放。
网络性能
- PCM 16/44.1 立体声:1.41 Mbps
- PCM 24/192 立体声:9.22 Mbps
- PCM 32/384 立体声:24.58 Mbps
- FLAC 24/192 立体声:约 4 Mbps(压缩约 50%)
多房间同步建议使用以太网。单个端点用 WiFi 完全没问题。
完全无头运行
这里描述的方案已经是 100% headless。烧写并启动之后,树莓派即可自主运行:
- OAAT 服务开机自启
- 崩溃后自动重启(systemd
Restart=always) - 控制器断开后自动重连
- 可通过 SSH 更新
实用链接:
- OAAT 源代码(Apache 2.0)
- OAAT RFC 规范
- Audiophonics ESS 9038Q2M 驱动
- Audiophonics —— I2S DAC 与树莓派机箱
本指南由 MozAIk Labs 撰写 —— 2026 年 5 月