开发语音识别或录制系统音频时遇到的一些问题记录1:getDisplayMedia和getUserMedia

290 阅读2分钟

❓问题重述:

  • navigator.mediaDevices.getUserMedia({ audio: true })只能获取麦克风音频
  • navigator.mediaDevices.getDisplayMedia({ audio: true }):可以获取屏幕共享时的系统音频
  • ❌ 不能通过 getUserMedia({ audio: true }) 获取系统的输出音频(如扬声器、媒体播放声音)

🔍 为什么不能用 getUserMedia({ audio: true }) 获取“系统声音”?

这是因为:

🧱 安全策略 + 隐私保护限制

浏览器(Chrome、Edge 等)为了防止网页偷偷监听你的扬声器内容默认不允许网页访问用户设备的“扬声器输出”,也就是 系统音频(system audio output)

  • getUserMedia({ audio: true }) 只允许访问 麦克风设备
  • 不允许访问电脑“正在播放的声音”(比如你听的音乐、看的视频)
  • 即使你用 deviceId 设置输出设备 ID 也没用,浏览器只允许输入设备

🔍 为什么不能用 getUserMedia({ audio: true }) 获取“系统声音”?

这是因为:

🧱 安全策略 + 隐私保护限制

浏览器(Chrome、Edge 等)为了防止网页偷偷监听你的扬声器内容默认不允许网页访问用户设备的“扬声器输出”,也就是 系统音频(system audio output)

  • getUserMedia({ audio: true }) 只允许访问 麦克风设备
  • 不允许访问电脑“正在播放的声音”(比如你听的音乐、看的视频)
  • 即使你用 deviceId 设置输出设备 ID 也没用,浏览器只允许输入设备

✅ 那为什么 getDisplayMedia({ audio: true }) 可以获取系统音频?

这是个例外情况。

当你发起:

js
复制编辑
navigator.mediaDevices.getDisplayMedia({ video: true, audio: true })

浏览器会提示用户选择“共享整个屏幕 + 是否包含音频”,如果用户勾选了:

✅「共享此屏幕的声音」

这时候浏览器会:

  • 合成一个 包含系统音频 的 MediaStream
  • 允许你通过 getDisplayMedia() 获取该音频轨道

这是一种受控授权的特殊情况,仅在用户明确同意的屏幕共享场景下允许访问系统声音。

✅ 结论

API 调用是否能获取系统声音说明
getUserMedia({ audio: true })只能获取麦克风
getDisplayMedia({ video: true, audio: true })✅(用户勾选后)可以获取系统音频(比如播放的视频声音)