我已经实现了视频静音和取消静音功能,该功能似乎可以很好地静音视频,但是在取消静音后,它似乎无法恢复将视频流传输到另一个对等端。
要静音,我会停止切换音轨,与切换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窗口中打开了该应用程序。一切正常,我看到两个窗口之间的视频同步良好。当我在一个窗口上按静音时,它将停止流播放,并且视频元素变黑。对于另一个窗口中的对等方,我的视频显示为冻结。也可以问题是当我取消视频静音时,我会看到本地流重新出现,但不再将新的流传输到对等端。同行仍然看到我冰冷的脸。
我在做什么错了?
答案 0 :(得分:1)
您使用的pc.removeTrack会导致重新协商,从而禁用收发器的发送方向。替换曲目不会引起重新协商,因此您不会发送。
要么只是停止跟踪(在发送方上拥有停止的跟踪通常是可以的),要么通过将其方向属性再次设置为arr[index]='\n' or'\r'
来再次更改关联的收发器的方向。