使用 ActivateAudioInterfaceAsync 采集不到 Microsoft Teams 播放给扬声器的声音,采集其他App(如浏览器等)的播放声音都是正常的。

MinBo Lv 0 信誉分
2024-08-20T03:47:09.5833333+00:00

我的使用场景

我有一个软件(名字叫A),想在使用 Teams 开会的使用,将 Teams 播放的声音采集出来,进行一些其他的处理,如加字幕等。

音频的传递是: Teams 收到声音 -> Teams 将声音传给扬声器 -> 软件A采集到声音。

我遇到的问题

在 Teams 开会的时候,我能从扬声器中听到 Teams 其他用户说话的声音,但是我的软件A采集不到其他用户的声音。补充一点:我的软件A采集浏览器,网易云音乐是正常,只是采集不到 Teams 的声音。

我采集扬声器方式


    AUDIOCLIENT_ACTIVATION_PARAMS params;
    params.ActivationType = AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK;
    params.ProcessLoopbackParams.ProcessLoopbackMode = 
PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE;
    params.ProcessLoopbackParams.TargetProcessId = A的进程号(不是teams的进程号,这个我可以确认);

    PROPVARIANT activateParams;
    activateParams.vt = VT_BLOB;
    activateParams.blob = {sizeof(params), reinterpret_cast<BYTE*>(&params)};

    waiter_ = Microsoft::WRL::Make<WASAPIActivateAudioInterfaceCompletionWaiter>(event_observer_);
    !waiter_->Init();
    ComPtr<IActivateAudioInterfaceAsyncOperation> async_opt;
    HRESULT hr = ActivateAudioInterfaceAsync(VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, __uuidof(IAudioClient),
                                             &activateParams, waiter_.Get(), &async_opt);

上面是我初始化 IAudioClient 的代码,我排除了A软件播放的声音,采集除了A以外的所有软件的声音,这肯定是包含了 Teams 的。

请帮忙看看是什么原因,我猜测可能和 Teams 播放音频的方式有关系(因为除了 Teams 其他软件都没有问题,可以正常采集到声音),是不是因为 Teams 使用独占的方式?有没有什么解决方案?

还有,如果我使用 IMMDevice::Activate 来获取 IAudioClient,是可以采集到 Teams 播放的声音的,但是这并不符合我最终的目的,因为我不想采集软件A播放的声音。


Microsoft::WRL::ComPtr<IMMDevice> mmDevice_; 
mmDevice_->Activate(__uuidof(IAudioClient), CLSCTX_ALL, nullptr, &audioClient_);

问题现象补充

并不是所有的电脑上有这个问题,在我的台式机上,使用ActivateAudioInterfaceAsync是可以采集到Teams声音的,但是在我的联想T490上采集不到Teams的声音。

采集不到Teams声音

笔记本电脑

img_v3_02dt_6d46cb19-7abc-47ad-8db6-09046035e69g

可以采集到Teams声音

台式机img_v3_02dt_e079b028-fd8a-4b32-bd8b-5cab3c428b2g

非常谢谢

Microsoft Teams
Microsoft Teams
Microsoft 可自定义的基于聊天的工作区。
12 个问题
Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
98 个问题
C++
C++
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
141 个问题
Microsoft Q&A
Microsoft Q&A
使用此标记与 Microsoft 问答团队共享建议、功能请求和 bug。 Microsoft 问答团队将定期评估你的反馈,并在此过程中提供更新。
111 个问题
{count} 票

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。