Skip to content

feat: 支持 Windows 按 PID 应用级音频 capture #18

@ByteColtX

Description

@ByteColtX

背景

当前 play capture 走 Windows WASAPI system loopback,会采集默认输出设备上的系统混音。对于只想串流某个应用音频的场景,这会把其他应用、系统通知等无关音频一起发送到 AirPlay 接收端。

wasapi = "0.23.0" 已经提供 AudioClient::new_application_loopback_client(process_id, include_tree),可以基于目标进程 PID 做 application loopback capture。因此第一版不需要引入新的音频 capture 依赖。

目标

第一版只支持显式 PID:

rairstream play capture --pid <PID> --device <selector>...

未传 --pid 时,保持现有系统级 capture 行为:

rairstream play capture --device <selector>...

非目标

  • 不支持按应用名选择。
  • 不支持按窗口标题选择。
  • 不在托盘 UI 增加应用级 capture 入口。
  • 不引入 sysinfo 或其他进程枚举依赖。
  • 不实现跨平台应用级 capture。
  • 不做视频、屏幕镜像或窗口 capture。
  • 不改变现有系统级 capture 行为。

技术方向

  • 在 capture/session 层引入 capture source 抽象,例如:
enum CaptureSource {
    SystemLoopback,
    ApplicationLoopback {
        process_id: u32,
        include_tree: bool,
    },
}
  • CLI play capture 增加 --pid <PID> 参数。
  • AppFacade::play_capture / session 层接收 capture source,但托盘入口继续只走系统级 capture。
  • WindowsCaptureDriver 保留现有 system loopback 构造路径。
  • 新增 application loopback 构造路径,使用 AudioClient::new_application_loopback_client(process_id, include_tree)
  • application loopback 需要显式指定 WaveFormat 和 buffer duration,不能依赖 get_mixformat() / get_device_period()
  • 第一版可使用 48kHz stereo f32 + autoconvert=true,复用现有 RAOP resampler。

验收标准

  • rairstream play capture --device <selector>... 行为不变。
  • rairstream play capture --pid <PID> --device <selector>... 可以采集目标进程树音频。
  • 托盘菜单和托盘播放逻辑不新增应用级 capture 入口。
  • 非 Windows 平台仍返回 unsupported。
  • PID 非法或 WASAPI 初始化失败时有清晰错误。
  • 覆盖 CLI parser、capture source 分支和非 Windows fallback 测试。
  • 不新增依赖。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions