You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时捕获多虚拟音频设备音频流并通过UDP转发至其他PC?

实现多虚拟音频设备同时捕获的解决方案

方法一:基于WaveIn接口的多线程多实例方案

WaveIn本身仅支持单设备捕获,但你可以通过为每个虚拟音频设备创建独立的WaveIn实例+线程来实现多通道同时捕获,具体步骤如下:

  • 枚举所有音频输入设备:调用waveInGetNumDevs()获取设备总数,再通过waveInGetDevCaps()遍历每个设备的信息,根据设备名称筛选出你的目标虚拟音频设备(比如包含特定标识的名称)。
  • 为每个目标设备启动独立线程:每个线程内初始化对应的WaveIn实例,设置音频格式(需与虚拟设备的播放格式匹配,比如采样率、位深、声道数),注册回调函数或绑定窗口消息来接收捕获的音频数据。
  • 线程内处理音频转发:捕获到音频数据后,直接在对应线程中通过UDP套接字将数据发送到目标PC,建议在数据包中加入通道编号,方便接收端区分不同设备的音频流。
  • 资源清理:程序退出时,需依次调用waveInStop()、waveInUnprepareHeader()、waveInClose()关闭每个WaveIn实例,并正确回收线程资源。

示例代码片段(枚举设备):

UINT deviceCount = waveInGetNumDevs();
for (UINT i = 0; i < deviceCount; i++) {
    WAVEINCAPS caps;
    waveInGetDevCaps(i, &caps, sizeof(WAVEINCAPS));
    // 筛选虚拟设备,比如名称包含"Virtual Audio Channel"
    if (strstr(caps.szPname, "Virtual Audio Channel") != NULL) {
        // 启动线程处理该设备的捕获
        std::thread captureThread([i]() {
            // 初始化WaveIn、设置格式、开始捕获...
        });
        captureThread.detach(); // 或管理线程生命周期
    }
}

方法二:使用更现代的WASAPI接口

如果你想摆脱WaveIn的限制,推荐使用Windows Core Audio中的WASAPI(Windows Audio Session API),它原生支持多设备同时捕获,且功能更灵活:

  • 用IMMDeviceEnumerator枚举所有音频输入设备,筛选出目标虚拟设备。
  • 为每个设备创建IAudioClient和IAudioCaptureClient实例,设置共享模式(避免与播放该音频的外部工具冲突),启动捕获。
  • 每个设备的捕获逻辑同样放在独立线程中,读取捕获到的音频数据后通过UDP转发。

关键注意事项

  • 音频格式匹配:捕获时必须使用与虚拟设备播放完全一致的格式(采样率、位深、声道数),否则会导致捕获失败或音频失真。
  • 共享模式设置:由于外部工具正在使用虚拟设备播放音频,捕获时必须设置为共享模式,不能用独占模式,否则会抢占设备导致播放中断。
  • UDP传输优化:实时音频流建议用RTP协议封装数据,加入时间戳和序列号,接收端可以做简单的丢包补偿,提升播放流畅度。

内容的提问来源于stack exchange,提问作者Roman Flickstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:25:38