WebRTC在通话中改变麦克风或网络摄像头

问题描述 投票:1回答:1

我想知道如何改变麦克风或网络摄像头。 你是在一个视频聊天的人。


我现在已经尝试了几天,没有任何工作。本例但似乎要实现改变是更难的,而有人已经连接。

我的问题是: 如果我换了麦克风,声音就会消失 麦克风没有任何反应。我也不能把它改回默认值。

如果我改变网络摄像头,也会发生类似的事情。流挂起,最后一帧被看到。

我没有收到任何错误信息,事实上,它告诉我更改是成功的。

在通话建立之前,更改网络摄像头就可以了。


这里是相关的代码块。我读到的每一个地方都只是创建新的约束条件,并给有声视频流提供所需的deviceId。

function ChangeDevice() {

  if (localStream) {
    localStream.getTracks().forEach(track => {
      track.stop();
    });
  }

  var audioSource = audioInputSelect.value;
  var videoSource = videoSelect.value;

  console.log(videoSource);
  console.log(audioSource);

  const newConstraints = {
    audio: {deviceId: audioSource ? {exact: audioSource} : undefined},
    video: {deviceId: videoSource ? {exact: videoSource} : undefined}
  };

  navigator.mediaDevices.getUserMedia(newConstraints).then(gotStream).then(gotDevices).catch(handleError);
}

function gotStream(stream) {

  console.log('Adding local stream.');
  localStream = stream;
  localVideo.srcObject = stream;
  sendMessage(['got user media', room]);
  if (isInitiator) {
    maybeStart();
  }
  return navigator.mediaDevices.enumerateDevices(); // I added this

}

我想这两个是相关的函数 ChangeDevice是在我从下拉菜单中选择新设备时调用的 id的是正确的。

这是我使用的全部代码。

pastebin.com6JrK4jJD。

javascript webrtc
1个回答
0
投票

幸运的是 replaceTrack 现在似乎在所有的浏览器上都能工作,所以不需要重新协商。

我不得不编辑我的 gotStream 这样的功能。

function gotStream(stream) {

  // If already started
  // Need this if webcam or mic changes
  if (isStarted) {
    var videoTrack = stream.getVideoTracks()[0];
    var audioTrack = stream.getAudioTracks()[0];

    var sender = pc.getSenders().find(function(s) {
      return s.track.kind == videoTrack.kind;
    });

    var sender2 = pc.getSenders().find(function(s) {
      return s.track.kind == audioTrack.kind;
    });

    console.log('found sender:', sender);
    sender.replaceTrack(videoTrack);
    sender2.replaceTrack(audioTrack);

    localStream = stream;
    localVideo.srcObject = stream;

  } else {
    console.log('Adding local stream.');
    localStream = stream;
    localVideo.srcObject = stream;
    sendMessage(['got user media', room]);
    if (isInitiator) {
      maybeStart();
    }
  }

  return navigator.mediaDevices.enumerateDevices(); // I added this

}
© www.soinside.com 2019 - 2024. All rights reserved.