截至今天,我认为适合您的情况的更好方法是使用 RTCRtpSender.replaceTrack 方法。
假设您的摄像头流是“camStream”,您可以使用以下方法获取所需的 RTCRtpSender 对象:
var camVideoTrack = camStream.getVideoTracks()[0];
var camAudioTrack = camStream.getAudioTracks()[0];
var videoSender = peerConnection.addTrack(camVideoTrack, camStream);
var audioSender = peerConnection.addTrack(camAudioTrack, camStream);
...
最后两行为连接添加视频和音频功能。
...
假设您的屏幕流是“screenStream”,那么您可以从相机切换到屏幕共享视频,如下所示:
var screenVideoTrack = screenStream.getVideoTracks()[0];
videoSender.replaceTrack(screenVideoTrack);
...
无需替换音轨,因为我们只想在保持音频输入相同的同时改变视觉效果。
使用这种方法的好处是不需要对等重新协商来切换视频源。
这种方法的另一个好处是您不需要停止 camStream。共享屏幕后,您可以使用以下命令切换回视频源:
videoSender.replaceTrack(camStream.getVideoTracks()[0]);
您可以查看replaceTrack的文档here
我有一个有效的 webrtc 会议解决方案,它支持使用这些类似步骤的屏幕共享和屏幕录制。你可以检查一下here
它可以在 Firefox 上开箱即用,但要使其在 chrome 上运行,您需要启用“实验性 Web 平台”标志(转到 chrome://flags/ )