OAAT —— 让 bit-perfect 多房间音频走向大众的开源协议
问题所在:高保真音频被牢牢锁死
20 年来,高保真网络音频流传输一直被专有协议所束缚。RAAT(Roon)提供无可挑剔的音质——但代价是什么?付费认证、闭源代码、封闭生态。DLNA 虽然开放,但技术上有诸多限制:没有多房间同步、gapless 时灵时不灵、延迟偏高。
OAAT(Open Advanced Audio Transport)解决了这个两难困境。这是我用 Rust 设计并实现的一个网络音频传输协议。它以 Apache 2.0 许可完全开源,兼取两者之长。
OAAT 带来了什么
- Bit-perfect 音频 —— PCM 最高 768 kHz / 32 bit,原生 DSD 最高 DSD512。零重采样,零妥协。
- 亚毫秒级多房间 —— 端点之间采用 PTP 同步,偏差小于 1 ms。媲美 RAAT,却无需授权。
- 智能协商 —— 协议会根据 DAC 的能力自动适配格式。无需手动配置。
- 零门槛 —— 无需认证、无需授权、没有 DRM。厂商用约 1 500 行 Rust 代码即可实现一个合规端点。
三通道架构
与 DLNA(HTTP pull、XML/SOAP)不同,OAAT 将各类职责分离:
- 控制(TCP 端口 9740)—— 轻量 JSON 消息:握手、格式协商、播放/暂停、元数据
- 音频(UDP 端口 9741)—— 带呈现时间戳的二进制数据包,服务端推送,零队头阻塞
- 时钟(UDP 端口 9742)—— 用于多房间同步的 PTP 交换
发现机制通过 mDNS/DNS-SD 自动完成。把一个端点接入网络,它就会出现。就这么简单。
graph LR
A["Tune Server"] -->|"TCP :9740 — contrôle JSON"| B["Endpoint OAAT"]
A -->|"UDP :9741 — audio PCM/FLAC"| B
A <-->|"UDP :9742 — clock sync PTP"| B
B -->|"I2S / USB"| C["DAC"]
style A fill:#4a90d9,stroke:#333,color:#fff
style B fill:#50c878,stroke:#333,color:#fff
style C fill:#f5a623,stroke:#333,color:#fff
协议对比
- OAAT:开源(Apache 2.0)、bit-perfect、原生 DSD、多房间同步 < 1 ms、端点约 1 500 行代码
- RAAT(Roon):bit-perfect、DSD、多房间——但属专有协议、认证收费、代码封闭
- DLNA/UPnP:开放——但没有多房间同步、gapless 不可靠、DSD 仅支持 DoP
- AirPlay 2:Apple 多房间——但限于 48 kHz/24 bit,不支持 DSD,生态封闭
- Chromecast:仅限 Google,有损重采样,最高 48 kHz
从协议到产品:一台 100 欧元的 Raspberry Pi
为了证明 OAAT 不只是一份理论规范,我把一台Raspberry Pi 4 搭配 Audiophonics ESS 9038Q2M DAC 变成了一个高端音频端点:
- 通过 DAC 的 I2C 寄存器实现硬件音量控制
- 7 种可配置的 FIR 滤波器(minimum phase、linear phase、apodizing……)
- 7 英寸触摸屏,以 kiosk 模式运行 Tune 界面
- systemd 服务、开机自启、无感重连
总成本:约 100 欧元。而一个通过 Roon Ready 认证的端点起价 500 欧元。
👉 完整安装指南已上线:把 Raspberry Pi 变成 OAAT 音频端点。
面向厂商与开发者
HAL(硬件抽象层)trait 只有 5 个方法。自动化合规工具用 20 项测试验证你的实现。
trait OaatHal {
fn configure_output(&mut self, format: AudioFormat) -> Result<()>;
fn write_frames(&mut self, data: &[u8], frames: usize) -> Result<usize>;
fn buffer_level(&self) -> usize;
fn set_volume(&mut self, level: u8) -> Result<()>;
fn actual_sample_rate(&self) -> Option<f64>;
}
在你的音乐服务器中嵌入 oaat-controller crate,即可获得 bit-perfect 多房间能力。提供 C 绑定(FFI)以便原生集成。
数据一览
- 9 个 Rust crate,约 8 000 行代码
- 20 项自动化合规测试
- 多房间同步偏差小于 1 ms(实测)
- 运行时约 50 MB 内存占用
- 兼容 PCM 768/32、DSD512、FLAC 压缩
- Apache 2.0 许可
在 Tune 中的集成
OAAT 已经集成进 Tune——由 MozAIk Labs 开发的源代码公开(BSL 1.1)音乐服务器。OAAT 端点会被自动发现,并作为播放区域出现——与 DLNA、AirPlay 或 Chromecast 一样,但音质更胜一筹。
链接
- 📄 完整 RFC 规范
- 💻 GitHub 上的源代码(Apache 2.0)
- 🌐 OAAT 介绍页面
- 🍓 指南:把 Raspberry Pi 变成 OAAT 端点
- 🎵 Tune —— 源代码公开的音乐服务器