Skip to content

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

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 测试。
  • 不新增依赖。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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