WebRTC视频流静音/取消静音后取消静音

时间:2020-10-11 04:48:23

标签: javascript video-streaming webrtc

我已经实现了视频静音和取消静音功能,该功能似乎可以很好地静音视频,但是在取消静音后,它似乎无法恢复将视频流传输到另一个对等端。

要静音,我会停止切换音轨,与切换enabled属性相反,因为停止音轨会关闭“视频开启”指示灯:

function muteVideo() {
  localStream.getVideoTracks()[0].stop();
  peerConnection.removeTrack(peerConnection.getSenders()[0]);
}

要取消静音,我再次请求相机(获取新视频流):

async function unmuteVideo() {
  localStream = await navigator.mediaDevices.getUserMedia({ video: true });
  document.getElementById('local-video').srcObject = localStream;
  await peerConnection.getSenders()[0].replaceTrack(localStream.getVideoTracks()[0]);
  peerConnection.getSenders()[0].setStreams(localStream);
}

这是我当前的WebRTC设置的CodePen链接:https://codepen.io/robkom/pen/MWewjLm。我正在Chrome 85中对其进行测试。

我的信令服务器是使用ws@hapi/hapi构建的简单网络套接字服务器。为了进行协商,我进行了以下设置:

peerConnection.addEventListener('negotiationneeded', async () => {
  const offer = await peerConnection.createOffer();
  await peerConnection.setLocalDescription(offer);
  webSocketConnection.send(JSON.stringify({ offer: peerConnection.localDescription }));
});

进行测试时,我在一个Chrome窗口中打开了该应用程序,同时也在一个隐身的Chrome窗口中打开了该应用程序。一切正常,我看到两个窗口之间的视频同步良好。当我在一个窗口上按静音时,它将停止流播放,并且视频元素变黑。对于另一个窗口中的对等方,我的视频显示为冻结。也可以问题是当我取消视频静音时,我会看到本地流重新出现,但不再将新的流传输到对等端。同行仍然看到我冰冷的脸。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您使用的pc.removeTrack会导致重新协商,从而禁用收发器的发送方向。替换曲目不会引起重新协商,因此您不会发送。

要么只是停止跟踪(在发送方上拥有停止的跟踪通常是可以的),要么通过将其方向属性再次设置为arr[index]='\n' or'\r'来再次更改关联的收发器的方向。