把 Android 手机的声音投到电脑 —— 基于 scrcpy 的音频会话管理器。
- Rust 49.5%
- Vue 29.6%
- TypeScript 8.5%
- Shell 6.1%
- CSS 4.2%
- Other 2.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| .vscode | ||
| assets | ||
| docs | ||
| LICENSES | ||
| packaging/arch | ||
| public | ||
| scripts | ||
| src | ||
| src-tauri | ||
| .gitignore | ||
| index.html | ||
| LICENSE | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
CastAudio
把 Android 手机的声音投到电脑 —— 基于 scrcpy 的音频会话管理器。
CastAudio 本质上是一个进程管理器与状态机:它不重新实现安卓端音频捕获,而是优雅地包装 scrcpy(--no-video 音频-only 模式),提供图形化的设备管理、参数配置、状态监控与系统托盘常驻能力。
特性
- USB + WiFi 双链路:设备热插拔实时感知;
adb pair/connect图形化添加无线设备;USB 一键转 WiFi - 多设备并发:每台手机独立会话与状态机(
Idle → Starting → Running → Stopping → Error);同一物理设备(ro.serialno识别)USB/WiFi 双链路合并展示、互斥保护、链路切换 - 参数图形化:音频源(output/playback/mic/mic-*)、编码器(Opus/AAC/FLAC/RAW)、比特率、双缓冲区(延迟调节)、音频复制(--audio-dup)、高级编码器选择(--list-encoders);低延迟/均衡/高音质三档预设;参数按设备记忆
- 音频流状态监控:运行时长、缓冲欠载(underrun)计数、scrcpy 日志实时分级展示(INFO/WARN/ERROR)
- 健壮性:scrcpy 错误行解析上屏(如编码器不支持)、意外断开自动重连(≤3 次退避)、adb server 崩溃自动拉起、退出时清理全部子进程
- 系统托盘:关闭窗口最小化到托盘(音频不中断);托盘菜单一键连接/断开(多设备子菜单)
- 依赖检查:
- Windows:内置 scrcpy/adb(官方 win64 包,脚本拉取),支持自定义路径
- Linux:优先系统 PATH,缺失时按发行版(arch/debian/fedora/suse…)给出安装命令
- macOS:Homebrew 优先(
brew install scrcpy)
- 版本门控:解析 scrcpy 版本,按能力启用 UI 选项(音频 ≥2.0,FLAC/RAW ≥2.2,audio-dup 与 mic-* ≥2.4),兼容 2.x–4.x
技术栈
Tauri 2 · Rust(tokio 进程管理)· Vue 3 · TypeScript · Naive UI
src-tauri/src/
├─ deps.rs 依赖检测:路径解析(自定义→内置→PATH)、版本与能力门控、平台安装提示
├─ adb.rs adb devices -l 轮询解析、pair/connect/disconnect、USB 转 WiFi
├─ scrcpy.rs 会话状态机:参数拼装、子进程与日志泵、metrics、自动重连、批量连接
├─ tray.rs 托盘动态菜单(设备列表 ✓ 状态、一键连接/全部断开/退出)
├─ settings.rs 设置与每设备参数持久化
├─ proc.rs 带超时的捕获式子进程封装
├─ state.rs AppState 聚合
└─ lib.rs Tauri 装配(命令/事件/窗口关闭→托盘/退出清理)
事件流:后端 devices-changed / session-state / session-log / session-metrics / deps-changed → 前端响应式 store。
开发
前置:Rust ≥ 1.77、Node ≥ 20、pnpm;Linux 需要 webkit2gtk-4.1 等 Tauri 依赖;系统安装 scrcpy ≥ 2.0 与 adb。
pnpm install
pnpm tauri dev # 开发运行
cargo test # Rust 单元测试(解析/拼装/门控纯函数)
pnpm tauri build # 打包
三平台(Windows/macOS/Linux)构建与 CI 发布见 docs/BUILD.md—— Tauri 不支持交叉编译,Windows/macOS 包需在对应系统或 GitHub Actions 上构建(仓库已带 release 工作流)。
Windows 打包(内置 scrcpy/adb)
.\scripts\fetch-scrcpy-win.ps1 # 或 bash scripts/fetch-scrcpy-win.sh
pnpm tauri build
脚本从 scrcpy 官方 GitHub Releases 拉取 scrcpy-win64 包解压到 src-tauri/resources/scrcpy-win64/(已 gitignore,可再生);tauri.windows.conf.json 将其注册为打包资源。镜像加速可设 SCRCPY_MIRROR 环境变量。
已知限制(v1)
- 音量监控为「流状态」级:scrcpy 自行通过 SDL 播放音频,不暴露电平数据,故 v1 提供运行状态/时长/underrun 监控而非 VU 电平表。真实电平表与「按设备路由到不同输出设备/独立音量」需自研音频管线(
--no-playback --audio-codec=raw --record=-stdout → 解封装 → cpal 播放),列入 v2 路线图 - Android 11 以下无系统音频捕获(scrcpy 上游限制);部分应用可对 playback 捕获 opt-out(用 output 源规避)
许可证
- CastAudio 源码:MIT
- scrcpy:Apache-2.0(© Genymobile),许可证全文见 LICENSES/scrcpy-LICENSE
- adb(Android Debug Bridge):AOSP 组件(platform/system/core),Apache-2.0(© The Android Open Source Project)。 Linux/macOS 使用系统发行版或 Homebrew 提供的 adb;Windows 内置包取自 scrcpy 官方发布包(含 adb.exe), 捆绑目录内保留其原始 LICENSE,仓库附 Apache-2.0 全文
- Android 与 Android 机器人形象为 Google LLC 的商标与作品。本应用图标为基于 Android 机器人形象的修改演绎: The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution license.
- 免责声明:本项目为独立开源项目,与 Google、Genymobile 无隶属、赞助或背书关系;文中 "Android" 仅用于描述兼容平台。