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

Windows 11下Microsoft Edge中setSinkId功能失效问题求助

setSinkId无法在Windows 11的Edge浏览器中切换音频输出设备

我正在开发一款Web应用,需要使用setSinkId为音频分配不同的输出设备,但在Windows 11的Microsoft Edge浏览器中遇到问题:无论选择哪个设备,音频始终从系统默认扬声器输出。

代码片段

btn.onclick = async (evt) => {
  // request device access the bad way,
  // until we get a proper mediaDevices.selectAudioOutput
  (await navigator.mediaDevices.getUserMedia({audio:true}))
      .getTracks().forEach(track => track.stop());
  
  const devices = await navigator.mediaDevices.enumerateDevices();
  const audio_outputs = devices.filter( (device) => device.kind === "audiooutput" );
  
  const sel = document.createElement("select");
  audio_outputs.forEach( (device, i) => sel.append(new Option( device.label || `device ${i}`, device.deviceId )) );
  document.body.append(sel);
  
  btn.textContent = "play audio in selected output";
  btn.onclick = (evt) => {
    const aud = new Audio("https://upload.wikimedia.org/wikipedia/en/d/dc/Strawberry_Fields_Forever_%28Beatles_song_-_sample%29.ogg");
    aud.setSinkId(sel.value);
    aud.play();
  };
}

复现步骤

  • 为系统连接外部扬声器
  • 运行上述代码
  • 选择系统扬声器作为输出设备

问题现象

音频通过外部扬声器播放,而非所选的系统扬声器。

环境信息

  • 浏览器:Microsoft Edge(最新版本)
  • 操作系统:Windows 11

疑问解答与解决方案

1. 是否有其他人在Windows 11的Edge中遇到过setSinkId此类问题?

是的,有不少开发者反馈过Windows 11平台上Edge浏览器中setSinkId的异常行为,主要集中在设备识别和输出路由的匹配问题上,部分情况是Windows的音频会话管理与浏览器的设备映射出现偏差。

2. 是否有已知解决方法,确保音频从所选扬声器播放?

可以尝试以下几种修复方案:

方案一:等待setSinkId异步操作完成后再播放

setSinkId返回Promise,直接调用play()可能在设备切换完成前就启动播放,导致音频走默认设备。修改代码如下:

btn.onclick = async (evt) => {
  const aud = new Audio("https://upload.wikimedia.org/wikipedia/en/d/dc/Strawberry_Fields_Forever_%28Beatles_song_-_sample%29.ogg");
  try {
    await aud.setSinkId(sel.value);
    await aud.play();
  } catch (err) {
    console.error('切换音频输出失败:', err);
  }
};

方案二:等待音频资源加载完成后操作

借助canplay事件确保音频资源就绪,再执行设备切换和播放:

btn.onclick = (evt) => {
  const aud = new Audio("https://upload.wikimedia.org/wikipedia/en/d/dc/Strawberry_Fields_Forever_%28Beatles_song_-_sample%29.ogg");
  aud.addEventListener('canplay', async () => {
    try {
      await aud.setSinkId(sel.value);
      aud.play();
    } catch (err) {
      console.error('切换音频输出失败:', err);
    }
  });
};

方案三:使用官方推荐的selectAudioOutput API

目前主流浏览器已支持selectAudioOutput,这是规范的音频输出设备选择方式,能避免getUserMedia带来的设备识别偏差:

btn.onclick = async (evt) => {
  try {
    const selectedDevice = await navigator.mediaDevices.selectAudioOutput();
    
    const aud = new Audio("https://upload.wikimedia.org/wikipedia/en/d/dc/Strawberry_Fields_Forever_%28Beatles_song_-_sample%29.ogg");
    await aud.setSinkId(selectedDevice.deviceId);
    await aud.play();
  } catch (err) {
    console.error('选择或切换音频输出失败:', err);
  }
};

3. 这是浏览器特定问题还是Windows 11的bug?

这属于浏览器与Windows 11音频子系统的兼容性问题:

  • Windows 11的音频会话管理机制(如应用音量和设备偏好设置)可能干扰浏览器的设备路由
  • Edge浏览器在设备ID映射、异步操作时序处理上存在小范围兼容性问题,部分版本已通过更新修复,但仍有场景出现异常

建议先将Edge浏览器更新到最新版本,再测试上述解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:49:59