【问题标题】:webrtc audio device disconnection and reconnectionwebrtc 音频设备断开和重新连接
【发布时间】:2019-03-01 02:17:35
【问题描述】:

我有一个基于 WebRTC 的视频通话应用程序。它按预期工作。但是,当通话进行时,如果我断开并连接回音频设备(麦克风 + 扬声器),则只有扬声器部分在工作。麦克风部分似乎无法正常工作 - 对方再也听不见了。

有什么方法可以通知 WebRTC 在音频设备重新连接后再次接受音频输入?

【问题讨论】:

  • 它是您的应用程序,还是您只是在使用它?如果这是一个编程问题,您使用的是什么语言,以及涉及哪些库(如果有)?简短的回答是肯定的,但一些上下文或代码将有助于确保我回答正确的问题。
  • 这是我在node.js中开发的应用程序作为信令服务器,端点在浏览器(html,java脚本)上。使用 webrtc 库和其他一切正常的 java 脚本。希望这能提供一些背景信息。

标签: javascript audio webrtc


【解决方案1】:

有什么方法可以通知 WebRTC 在音频设备重新连接后再次接受音频输入?

您的问题看起来很简单 - 扬声器的对称性很有吸引力 - 但一旦我们处理拥有多个摄像头和麦克风的用户,事情就没有那么简单了:如果您的用户断开他们正在使用的蓝牙耳机,您是否应该等待他们重新连接它,还是立即切换到他们的笔记本电脑麦克风?如果是后者,如果他们稍后重新连接,你会切换回来吗?这些是申请决定。

处理这些事情的 API 是:主要是 endeddevicechange 事件,以及 replaceTrack() 方法。您可能还需要deviceId 约束和enumerateDevices() 方法来处理多个设备。

但是,为了简单起见,让我们从表面上看问题中的假设来探索 API:

当用户在通话中拔出他们唯一的麦克风(而不是他们的摄像头)时,我们的工作是在他们重新插入麦克风时恢复与它的对话,而不会丢失视频:

  1. 首先,我们监听 ended 事件以了解我们的本地音轨何时丢失。
  2. 发生这种情况时,我们会侦听 devicechange 事件以检测(任何)重新插入。
  3. 当这种情况发生时,我们可以使用 enumerateDevices() 检查发生了什么变化,或者干脆再次尝试 getUserMedia(这次只使用麦克风)。
  4. 如果成功,请使用await sender.replaceTrack(newAudioTrack) 发送我们的新音频。

这可能看起来像这样:

let sender;

(async () => {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
    pc.addTrack(stream.getVideoTracks()[0], stream);
    sender = pc.addTrack(stream.getAudioTracks()[0], stream);
    sender.track.onended = () => navigator.mediaDevices.ondevicechange = tryAgain;
  } catch (e) {
    console.log(e);
  }
})();

async function tryAgain() {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({audio: true});
    await sender.replaceTrack(stream.getAudioTracks()[0]);
    navigator.mediaDevices.ondevicechange = null;
    sender.track.onended = () => navigator.mediaDevices.ondevicechange = tryAgain;
  } catch (e) {
    if (e.name == "NotFoundError") return;
    console.log(e);
  }
}

// Your usual WebRTC negotiation code goes here

以上内容仅供参考。我敢肯定有很多极端情况需要考虑。

【讨论】:

  • 感谢您的详细解释。将尝试建议的方法。
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多