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

不播放声音,如何将应用添加至Windows音频混音器以创建IAudioSessionControl2?

无需播放音频即可创建IAudioSessionControl2的解决方案

核心思路是:Windows的音频会话与IAudioClient实例绑定,只要初始化一个静默的音频客户端(无需播放实际音频数据),系统就会自动为你的应用创建音频混音器会话,进而可以直接获取IAudioSessionControl2接口实现自定义音量控制。

具体实现步骤

  • 初始化MMDeviceEnumerator,获取系统默认的音频渲染设备(如扬声器)
  • 创建IAudioClient实例,通过GetMixFormat获取系统默认的音频格式
  • 调用IAudioClient::Initialize初始化客户端,使用共享模式并设置AUDCLNT_STREAMFLAGS_NOPERSIST(避免会话持久化),无需启动播放
  • 通过IAudioClient::GetService直接获取IAudioSessionControl2接口

C++代码示例

#include <mmdeviceapi.h>
#include <audioclient.h>
#include <functiondiscoverykeys_devpkey.h>

HRESULT CreateSilentAudioSession(IAudioSessionControl2** ppSessionControl)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator* pEnumerator = nullptr;
    IMMDevice* pDevice = nullptr;
    IAudioClient* pAudioClient = nullptr;
    WAVEFORMATEX* pMixFormat = nullptr;

    // 创建音频设备枚举器
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), 
                          nullptr, 
                          CLSCTX_ALL, 
                          __uuidof(IMMDeviceEnumerator), 
                          (void**)&pEnumerator);
    if (FAILED(hr)) goto cleanup;

    // 获取默认多媒体渲染设备
    hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
    if (FAILED(hr)) goto cleanup;

    // 激活音频客户端
    hr = pDevice->Activate(__uuidof(IAudioClient), 
                           CLSCTX_ALL, 
                           nullptr, 
                           (void**)&pAudioClient);
    if (FAILED(hr)) goto cleanup;

    // 获取系统默认混合格式
    hr = pAudioClient->GetMixFormat(&pMixFormat);
    if (FAILED(hr)) goto cleanup;

    // 初始化音频客户端(不启动播放,仅创建会话)
    hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, 
                                  AUDCLNT_STREAMFLAGS_NOPERSIST, 
                                  0, 0, 
                                  pMixFormat, 
                                  nullptr);
    if (FAILED(hr)) goto cleanup;

    // 获取IAudioSessionControl2接口
    hr = pAudioClient->GetService(__uuidof(IAudioSessionControl2), 
                                  (void**)ppSessionControl);

cleanup:
    // 释放资源
    CoTaskMemFree(pMixFormat);
    if (pAudioClient) pAudioClient->Release();
    if (pDevice) pDevice->Release();
    if (pEnumerator) pEnumerator->Release();
    return hr;
}

关键说明

  • 无需调用IAudioClient::Start()播放任何数据,初始化客户端后系统就会创建音频会话,混音器中会立即显示你的应用
  • 可以通过IAudioSessionControl2::SetDisplayName设置会话的自定义显示名称,优化混音器中的展示效果
  • 这种方式和Firefox、旧版Windows Media Player的实现逻辑一致,完全不需要嵌入或播放空白音频文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:48:39