此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

获取麦克风权限

在创建对等方后,你将希望获得浏览器访问麦克风的权限。我们将使用 navigator.mediaDevices 对象的 getUserMedia() 方法。getUserMedia() 端点接受一个 constraints 对象,该对象指定所需的权限。getUserMedia() 是一个 promise,当成功兑现时,会返回一个包含来自我们流的音频的 MediaStream 对象。如果 promise 没有成功兑现,你将需要捕获并显示错误。

  1. 在你的 script.js 文件底部添加以下代码:

    js
    function getLocalStream() {
      navigator.mediaDevices
        .getUserMedia({ video: false, audio: true })
        .then((stream) => {
          window.localStream = stream; // A
          window.localAudio.srcObject = stream; // B
          window.localAudio.autoplay = true; // C
        })
        .catch((err) => {
          console.error(`you got an error: ${err}`);
        });
    }
    

    让我们解释一下最重要的几行:

    • window.localStream = streamMediaStream 对象(我们在上一行赋值给 stream 的对象)附加到窗口的 localStream
    • window.localAudio.srcObject = stream 将 ID 为 localAudio<audio> 元素src 属性设置为由 promise 返回的 MediaStream,以便它会播放我们的流。
    • window.localAudio.autoplay = true<audio> 元素的 autoplay 属性设置为 true,以便音频自动播放。

    警告: 如果你在网上进行了一些调查,可能会发现 navigator.getUserMedia 并认为你可以使用它而不是 navigator.mediaDevices.getUserMedia。你是错误的。前者是一个已弃用的方法,它需要回调以及约束作为参数。后者使用 promise,因此你不需要使用回调。

  2. 通过在代码底部添加以下行来尝试调用你的 getLocalStream 函数:

    js
    getLocalStream();
    
  3. 刷新你的应用程序,它应该仍在 localhost:8000 上运行;你应该看到以下权限弹出窗口:

    一个浏览器权限对话框,上面写着“http://localhost:8000 想要使用你的麦克风”,下面有两个选项:“阻止”和“允许”

  4. 在允许麦克风使用之前,插入一些耳机,这样当你稍后取消静音时,你不会听到任何反馈。如果你没有看到权限提示,请打开检查器查看是否有任何错误。确保你的 JavaScript 文件正确链接到你的 index.html

这就是所有内容的综合效果:

js
/* 全局对等方 */

/**
 * 获取当前呼叫者的本地音频流
 * @param callbacks - 一个对象,用于设置成功或错误时的行为
 * @returns {void}
 */

function getLocalStream() {
  navigator.mediaDevices
    .getUserMedia({ video: false, audio: true })
    .then((stream) => {
      window.localStream = stream;
      window.localAudio.srcObject = stream;
      window.localAudio.autoplay = true;
    })
    .catch((err) => {
      console.error(`你得到了一个错误:${err}`);
    });
}

getLocalStream();