Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript webrtc音频设备断开和重新连接_Javascript_Audio_Webrtc - Fatal编程技术网

Javascript webrtc音频设备断开和重新连接

Javascript webrtc音频设备断开和重新连接,javascript,audio,webrtc,Javascript,Audio,Webrtc,我有一个基于WebRTC的视频通话应用程序。它正在按预期工作。然而,当通话进行时,若我断开并连接回音频设备(麦克风+扬声器),只有扬声器部分工作。麦克风部分似乎不工作-另一边听不见了 一旦音频设备重新连接,是否有办法通知WebRTC再次进行音频输入 一旦音频设备重新连接,是否有办法通知WebRTC再次进行音频输入 你的问题看起来很简单扬声器的对称性很吸引人,但一旦我们与拥有多个摄像头和麦克风的用户打交道,问题就不那么简单了:如果你的用户断开了他们正在使用的蓝牙耳机,你应该等他们重新连接,还是立即

我有一个基于WebRTC的视频通话应用程序。它正在按预期工作。然而,当通话进行时,若我断开并连接回音频设备(麦克风+扬声器),只有扬声器部分工作。麦克风部分似乎不工作-另一边听不见了

一旦音频设备重新连接,是否有办法通知WebRTC再次进行音频输入

一旦音频设备重新连接,是否有办法通知WebRTC再次进行音频输入

你的问题看起来很简单扬声器的对称性很吸引人,但一旦我们与拥有多个摄像头和麦克风的用户打交道,问题就不那么简单了:如果你的用户断开了他们正在使用的蓝牙耳机,你应该等他们重新连接,还是立即切换到笔记本电脑麦克风?如果是后者,如果他们稍后重新连接,您是否切换回?这些是应用程序决策

处理这些事情的API主要有:和事件以及方法。您可能还需要约束和方法来处理多个设备

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

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

  • 首先,我们收听
    结束
    事件,了解本地音轨何时下降
  • 当这种情况发生时,我们监听
    devicechange
    事件以检测(任何内容)的重新插入
  • 当这种情况发生时,我们可以使用enumerateDevices()检查发生了什么变化,或者只需再次尝试getUserMedia(这次仅使用麦克风)
  • 如果成功,请使用
    wait 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
    

    以上仅作说明。我确信有很多角落的情况需要考虑。

    这是你的应用程序,还是仅仅在使用它?如果这是一个编程问题,您使用的是什么语言,涉及到哪些库(如果有的话)?简短的回答是肯定的,但一些上下文或代码将有助于确保我回答了正确的问题。它是我在node.js中作为信令服务器开发的应用程序,端点在浏览器上(html、java脚本)。使用webrtc库和其他普通java脚本。希望这能提供一些背景。感谢您的详细解释。将尝试建议的方法。