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

如何用PlaySound()将音频指定播放到扬声器而非默认耳机?

解决PlaySound无法指定扬声器输出的问题

PlaySound() 本身没有提供直接指定音频输出设备的参数,它只会遵循系统默认音频输出设备,或者程序进程关联的音频设备——你在系统声音设置里给单个文件指定的输出规则,对PlaySound这类不支持进程级音频路由的API不起作用。

要实现指定扬声器播放,必须改用更底层的Windows音频API,以下是两种可行方案:

方案1:使用WaveOut系列API

WaveOut API支持枚举系统音频设备,并指定设备播放WAV文件,核心步骤如下:

  • 调用 waveOutGetNumDevs() 获取系统中音频输出设备的总数
  • 遍历设备,通过 waveOutGetDevCaps() 获取设备信息,根据设备名称筛选出目标扬声器
  • 打开目标设备,读取WAV文件的音频数据,调用 waveOutWrite() 完成播放

示例代码片段:

#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

// 枚举并查找扬声器设备ID
UINT GetSpeakerDeviceID() {
    UINT deviceCount = waveOutGetNumDevs();
    for (UINT i = 0; i < deviceCount; ++i) {
        WAVEOUTCAPS deviceCaps{};
        if (waveOutGetDevCaps(i, &deviceCaps, sizeof(deviceCaps)) == MMSYSERR_NOERROR) {
            // 根据设备名称匹配,这里以中文"扬声器"为例,英文环境可替换为对应名称
            if (wcscstr(deviceCaps.szPname, L"扬声器") != nullptr) {
                return i;
            }
        }
    }
    return WAVE_MAPPER; // 找不到则回退到默认设备
}

// 指定设备播放WAV文件(需补充WAV数据读取逻辑)
void PlayWavOnSpecificDevice(const wchar_t* filePath, UINT deviceId) {
    // 1. 读取WAV文件头和音频数据(此处省略具体实现)
    WAVEFORMATEX wfx{};
    WAVEHDR waveHdr{};
    // ... 填充wfx和waveHdr的内容 ...

    // 2. 打开指定音频设备
    HWAVEOUT hWaveOut{};
    if (waveOutOpen(&hWaveOut, deviceId, &wfx, NULL, NULL, CALLBACK_NULL) == MMSYSERR_NOERROR) {
        // 3. 写入音频数据并播放
        waveOutPrepareHeader(hWaveOut, &waveHdr, sizeof(WAVEHDR));
        waveOutWrite(hWaveOut, &waveHdr, sizeof(WAVEHDR));
        // 4. 播放完成后清理资源(需等待播放结束)
        // ...
    }
}

方案2:使用Windows Core Audio API(MMDeviceAPI)

这是Windows Vista及以上系统推荐的现代音频API,支持更精细的设备管理和音频控制,步骤大致为:

  • 初始化COM环境
  • 枚举所有活动的音频输出设备
  • 根据设备ID或名称定位目标扬声器
  • 创建音频渲染客户端,将WAV数据写入设备完成播放

该方案功能更全面,适合复杂的音频场景。

总结:PlaySound无法实现指定输出设备的需求,必须改用WaveOut或Core Audio这类底层API才能达成目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:37:41