背景
当前 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 测试。
- 不新增依赖。
背景
当前
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:
未传
--pid时,保持现有系统级 capture 行为:非目标
sysinfo或其他进程枚举依赖。技术方向
play capture增加--pid <PID>参数。AppFacade::play_capture/ session 层接收 capture source,但托盘入口继续只走系统级 capture。WindowsCaptureDriver保留现有 system loopback 构造路径。AudioClient::new_application_loopback_client(process_id, include_tree)。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>...可以采集目标进程树音频。