把 Android 手机的声音投到电脑 —— 基于 scrcpy 的音频会话管理器。
  • Rust 49.5%
  • Vue 29.6%
  • TypeScript 8.5%
  • Shell 6.1%
  • CSS 4.2%
  • Other 2.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-01 15:06:16 +08:00
.github/workflows packaging: Linux 发行包拆分 deb + Arch pkg.tar.zst;AppImage 降为预留不上传 2026-10-01 03:37:11 +08:00
.vscode feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
assets feat: v0.1.0 封版 —— 图标/帮助/孤儿防护/热切换/三平台脚本/CI/Forgejo 发布 2026-10-01 03:19:24 +08:00
docs docs: BUILD.md 同步 Release 资产新命名规则与 Arch 安装示例 2026-10-01 15:06:16 +08:00
LICENSES feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
packaging/arch packaging: Linux 发行包拆分 deb + Arch pkg.tar.zst;AppImage 降为预留不上传 2026-10-01 03:37:11 +08:00
public feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
scripts feat(release): 资产名加系统标识(CastAudio_<os>_<ver>_<arch>) 2026-10-01 15:05:47 +08:00
src feat: v0.1.0 封版 —— 图标/帮助/孤儿防护/热切换/三平台脚本/CI/Forgejo 发布 2026-10-01 03:19:24 +08:00
src-tauri fix(windows): 子进程加 CREATE_NO_WINDOW,消除 adb/scrcpy 控制台闪窗 2026-10-01 04:18:31 +08:00
.gitignore feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
index.html feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
LICENSE feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
package.json feat: v0.1.0 封版 —— 图标/帮助/孤儿防护/热切换/三平台脚本/CI/Forgejo 发布 2026-10-01 03:19:24 +08:00
pnpm-lock.yaml feat: v0.1.0 封版 —— 图标/帮助/孤儿防护/热切换/三平台脚本/CI/Forgejo 发布 2026-10-01 03:19:24 +08:00
pnpm-workspace.yaml feat: v0.1.0 封版 —— 图标/帮助/孤儿防护/热切换/三平台脚本/CI/Forgejo 发布 2026-10-01 03:19:24 +08:00
README.md feat: v0.1.0 封版 —— 图标/帮助/孤儿防护/热切换/三平台脚本/CI/Forgejo 发布 2026-10-01 03:19:24 +08:00
tsconfig.json feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
tsconfig.node.json feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00
vite.config.ts feat: CastAudio v0.1.0 — scrcpy 音频投送管理器完整实现 2026-10-01 01:54:35 +08:00

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" 仅用于描述兼容平台。