WebRTC 视频流静音/取消静音后不流式传输

WebRTC video streaming mute / unmute not streaming after unmute

我已经实施了视频静音和取消静音功能,似乎可以很好地使视频静音,但在取消视频静音后,它似乎没有恢复将视频流式传输到其他对等设备。

为了静音,我停止了轨道而不是切换 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 link:https://codepen.io/robkom/pen/MWewjLm。我正在 Chrome 85.

中进行测试

我的信令服务器是一个使用 ws@hapi/hapi 构建的简单 websocket 服务器。对于谈判,我有以下设置:

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

测试时,我在一个 Chrome window 中打开该应用程序,也在隐身 Chrome window 中打开同一个应用程序。一切都按预期进行,我看到视频在两个 windows 之间同步正常。当我在一个 window 上按下静音时,它停止了流并且视频元素变黑了。对于另一个 window 中的同行,我的视频似乎冻结了。那也可以。问题是当我取消视频静音时,我看到我的本地流重新出现,但它不再将新流传输到对等方。同行还看到我冻僵的脸

我做错了什么?

您正在使用 pc.removeTrack,这会导致禁用收发器发送方向的重新协商。更换曲目不会导致重新协商,因此您不会发送。

要么只是停止轨道(在发送器上停止轨道通常是可以的),要么通过再次将其方向属性设置为 sendrecv 来再次更改关联收发器的方向。