AudioRouter 是一个面向 Windows 的低延迟桌面音频转发工具。它通过 WASAPI Loopback 捕获指定播放设备的系统声音,再将音频实时输出到另一台播放设备。
适合以下场景:
- 将电脑声音转发到 USB 耳机、HDMI 或视频采集卡中的一个目标设备
- 为 OBS、录屏或直播环境建立独立的监听输出链路
- 在不同声卡之间转发游戏、媒体或系统声音
- 观察音频缓冲、延迟、欠载和时钟漂移等运行状态
监听设备是 Windows 播放设备,不是麦克风。监听设备和输出设备不能选择为同一个设备。
- 枚举当前处于活动状态的 Windows 播放设备
- 指定播放设备进行 WASAPI Loopback 捕获
- 将捕获的音频转发到另一台播放设备
- 支持
20 / 50 / 100 / 150 / 200 ms延迟档位,默认50 ms - 保存监听设备 ID、输出设备 ID 和延迟配置
- 实时显示延迟、缓冲、速率、欠载和时钟校正信息
- 已运行的转发异常中断后,按原设备 ID 检测并尝试恢复
- 正确停止并释放捕获、处理和输出资源
当前界面采用紧凑型三段布局:
┌──────────────────────────────────────────────────────────────┐
│ 音频转发器 ● 当前状态 刷新设备 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 声音来源 音频处理 输出设备 │
│ 播放设备 A ──▶ WASAPI / 延迟档位 ──▶ 播放设备 B │
│ │
│ 实时状态:估算延迟 · 当前/峰值缓冲 · 输出状态 · 运行时间 │
│ │
│ ▸ 高级性能数据 │
├──────────────────────────────────────────────────────────────┤
│ ● 链路状态 开始/停止转发 │
└──────────────────────────────────────────────────────────────┘
状态颜色:
- 灰色:已停止
- 绿色:正在转发
- 橙色:设备异常,等待自动恢复
开始和停止共用一个主控制按钮,按钮会根据当前状态自动切换操作。
- 启动程序。
- 在“声音来源”中选择需要监听的播放设备。
- 在“输出设备”中选择另一台播放设备。
- 选择目标延迟。建议先使用默认的
50 ms。 - 点击“开始转发”。
- 通过实时状态确认延迟、缓冲和运行时间是否稳定。
- 需要结束时,点击同一位置的“停止转发”。
转发运行期间设备和延迟配置会被锁定。停止转发后可以重新选择设备或延迟档位。
50 ms 是首次运行或配置不可用时的默认值。监听设备、输出设备和延迟档位会在成功开始转发后保存,下次启动优先恢复已保存的有效配置。
| 档位 | 建议场景 | 说明 |
|---|---|---|
| 20 ms | 对延迟敏感、驱动稳定的设备 | 对 USB、HDMI 驱动和系统调度要求较高 |
| 50 ms | 日常低延迟使用 | 默认档位,优先推荐 |
| 100 ms | 普通监听、采集卡 | 延迟与稳定性较均衡 |
| 150–200 ms | 兼容性优先 | 适合容易欠载或偶发卡顿的设备 |
界面中的“估算延迟”是软件音频链路估算值,不是扬声器到人耳的声学端到端测量值。实际延迟还会受到 Windows 音频引擎、设备驱动、USB/HDMI 链路和设备内部缓冲影响。
普通模式默认显示:
- 估算延迟
- 当前缓冲和峰值缓冲
- 输出状态
- 本次转发运行时间
展开“高级性能数据”可以查看:
- 配置档位
- 活动处理管线与捕获/输出请求周期
- 捕获速率
- 有效输出速率与累计补零
- 捕获回调频率与最大回调间隔
- 欠载和重缓冲次数
- 重采样时钟校正、追赶状态与累计丢弃时长
常见术语:
| 指标 | 含义 |
|---|---|
| 缓冲 | 尚未被输出设备消费的音频时长,单位通常为毫秒 |
| 峰值缓冲 | 本次转发过程中观察到的最大缓冲时长 |
| 欠载 | 输出请求到来时,可用音频数据不足 |
| 重缓冲 | 欠载后重新积累启动水位的次数 |
| 补零 | 数据不足时,为保持输出连续而填充的静音时长 |
| 时钟校正 | 为补偿两台设备时钟偏差而进行的轻微重采样调整 |
| 追赶 / 丢弃 | 缓冲过高时加速消费或丢弃旧数据,避免延迟持续累积 |
不同设备没有统一的正常阈值,应重点观察指标是否持续恶化。如果缓冲不断增大,通常表示来源与输出设备的时钟存在偏差,或输出设备无法及时消费数据;如果欠载、重缓冲或补零持续增加,可以尝试提高延迟档位。
转发已经成功启动后,如果 USB 声卡、HDMI 音频设备或视频采集卡断开,或者音频链路发生异步运行故障,程序会:
- 停止当前音频转发并释放相关资源。
- 进入橙色“等待设备恢复”状态。
- 每 2 秒检查之前选择的两个设备 ID。
- 当监听设备和输出设备重新可用时,尝试恢复原转发配置。
恢复只会重试原来的设备,不会自动切换到其他设备。重试没有次数或时间上限,会持续到恢复成功、用户点击“停止恢复”或程序关闭。如果设备重连后被 Windows 分配了新的 ID,需要停止恢复、刷新设备并重新选择。
首次点击“开始转发”时如果初始化失败,程序会直接显示错误,不会进入自动恢复状态。
程序保存的是 Windows 音频端点 ID,而不是设备友好名称,可以降低同名设备造成误匹配的概率。更换 USB 接口、重装驱动或系统重新创建设备端点后,设备 ID 仍可能变化。
配置文件位置:
%LOCALAPPDATA%\AudioRouter\settings.json
保存内容包括:
- 监听设备 ID
- 输出设备 ID
- 延迟档位
活动播放设备
│
▼
WASAPI Loopback Capture
│
▼
实时缓冲与预缓存控制
│
▼
采样率/时钟漂移校正
│
▼
WASAPI 输出设备
程序优先尝试低延迟 Loopback 捕获和 Direct WASAPI 共享模式输出。如果设备或驱动不支持当前链路,会尝试兼容捕获、稳定输出参数或 Media Foundation 兼容路径。兼容路径以稳定性为优先,实际延迟可能明显增加。
主要技术:
- .NET 8
- WPF
- NAudio 2.3.0
- HandyControl 3.5.1
- CommunityToolkit.Mvvm 8.4.2
项目保持 MVVM 结构,音频转发、设备枚举、诊断统计和配置保存分别由独立服务负责。
- Windows 10 或 Windows 11
- .NET 8 SDK
- 开始转发时,至少两台处于活动状态的 Windows 播放设备
仓库通过 global.json 使用 .NET SDK 8.0.423,并允许使用同一功能带中的更新补丁版本。只运行已构建程序时,需要安装 .NET 8 Desktop Runtime。
在仓库根目录执行:
dotnet restore AudioRouter.sln
dotnet build AudioRouter.sln -c Release
dotnet run --project AudioRouter/AudioRouter.csproj -c ReleaseRelease 构建产物默认位于:
AudioRouter\bin\Release\net8.0-windows\
- 程序只能捕获播放设备当前实际输出的声音。
- 当前是单来源、单目标转发,不支持同时输出到多个设备。
- 监听设备与输出设备必须不同。
20 ms是目标配置,不代表所有设备都能稳定达到相同的实际延迟。- WASAPI、驱动和硬件缓冲决定了无法实现物理意义上的绝对零延迟。
- HDMI、USB 声卡和采集卡重新连接后,Windows 可能需要短暂时间才能完成设备初始化。
- 当前版本尚未提供真实输入/输出音量电平和实时采样波形。
- 当前不支持麦克风输入、单应用捕获、音量调节、托盘驻留或 Windows 服务模式。