一套通过 Web 界面控制无线电(FM)广播发射的平台:管理音频、编排播放清单、实时调节音量/EQ,并把声音发射到任意 FM 收音机。
AirPlay 让一台小主机(Linux 盒子或树莓派)化身低成本的 FM 广播发射站。它把音频文件通过调频无线电波广播出去,任何普通的 FM 收音机、车载收音机或手机 FM,都能调到对应频率收听。
它解决的是"用最简单的方式,把本地的声音播到整个空间"这件事:
- 无需专门的广播硬件——插上一个几十元的 USB FM 发射器,或直接用树莓派的 GPIO 引脚发射即可。
- 全程网页操作——不需要装任何客户端,浏览器打开即用。
- 可远程管理——部署在局域网内,随时添加音乐、调整节目、改变频率。
⚠️ 本项目名中的 "AirPlay" 指通过无线电波(FM)广播发射,与 Apple 的 AirPlay 无线流媒体协议无关。
AirPlay 适合需要"把声音播给一群用收音机听的人"的场景:
- 校园 / 社区广播:教室、宿舍、园区里架一台盒子,学生用收音机即可收听节目,无需大规模布线。
- 车载收听:停车场、车队、洗车店、加油站等场景,向经过的车内收音机广播通知或音乐。
- 零售 / 餐饮:门店、超市、餐厅、咖啡馆,把背景音乐、促销播报广播给顾客的收音机。
- 活动 / 展会:临时会场、展会、集市,快速搭建一套本地广播,覆盖有限范围的听众。
- DIY 无线电爱好者:用树莓派 + PiFmRds 体验 FM 发射与 RDS 电台信息,学习无线电原理。
| 功能 | 说明 |
|---|---|
| 📂 音频文件管理 | 扫描音乐目录、手动上传,支持 mp3 / ape / flac / wav / m4a / ogg 等常见格式 |
| 🎵 播放清单编排 | 拖拽排序清单与曲目,组合不同节目(如早间新闻、午后音乐) |
| 📻 FM 广播发射 | 选择广播方式与频率,把音频实时发射到 FM 波段 |
| 🎚️ 音量 / EQ | 三段 EQ(低/中/高)与音量调节,播出前整形声音 |
| 📡 RDS 电台信息 | 广播电台台名(PS)与电台文字(RT),兼容车载收音机显示 |
| 🔄 播放模式 | 顺序 / 随机、循环(单曲 / 全部)、清单播完自动切换 |
| 📊 实时频谱 | 随音频节奏跳动的频谱动画与节拍可视化,观赏性强 |
AirPlay 支持两种发射路径,在系统设置里一键切换:
- ALSA · USB FM 发射器——USB 发射器插入后即是一个 ALSA 音频设备,选中它即完成发射。频率仅作展示,发射频点由设备自身决定。
- PiFmRds · 树莓派 GPIO——利用树莓派的 PWM 引脚直接发射 FM,并支持 RDS(台名 / 电台文字),频率真正生效。
无论哪种方式,只要你有一台能收到 FM 的设备,调到对应频率就能收听。
- 单二进制部署:前端(Vue 3)打包后嵌入 Go 后端,一个可执行文件即完整系统,免安装依赖。
- 实时推送:播放状态、频谱、进度经 SSE 实时推送到浏览器,无需刷新。
- 跨平台播放引擎:Linux 下用
ffmpeg + aplay/amixer真实播放;非 Linux(开发机)自动降级为模拟播放,便于本地开发。 - 配置自管理:音乐目录、设备、音量、EQ、播放模式等全部存入系统配置表,网页内即可修改。
# 前端开发
cd frontend && npm install && npm run dev
# 后端开发(SQLite 依赖 cgo,请在 WSL 中运行)
cd /mnt/d/coder/Go/src/airplay && go run ./cmd/airplay.go -dev
# 构建单二进制(amd64)
make build
# 构建树莓派 arm64(前端 + arm64)
make build-armairplay/
├─ cmd/airplay.go # 入口
├─ internal/
│ ├─ player/ # 跨平台播放引擎(linux + stub)
│ ├─ api/ # HTTP 接口
│ ├─ impl/service/ # 播放调度器 + 业务
│ └─ impl/store/ # 数据读写 + 配置
├─ frontend/ # Vue3 前端
├─ html/ # 内嵌前端构建产物
└─ doc/开发计划.md



