WebRTC - 在通信过程中更改视频流

Abd*_*man 5 javascript google-chrome video-streaming audio-streaming webrtc

我的目标是使用 webrtc web 应用程序在视频或音频通话中启用屏幕共享。

好吧,我发现我可以MediaStreamTrack.applyConstraints()用来更改视频属性,但是可以更改视频源吗?此外,如何将视频添加到现有的音频流。

我现在只需要它在 chrome 上工作。

Ant*_*nwu 5

截至今天,我觉得对您的情况更好的方法是使用 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);
Run Code Online (Sandbox Code Playgroud)

...

最后两行为连接添加了视频和音频功能。

...

假设您的屏幕流是“screenStream”,那么您可以像这样从相机切换到屏幕共享视频:

var screenVideoTrack = screenStream.getVideoTracks()[0];
videoSender.replaceTrack(screenVideoTrack);
Run Code Online (Sandbox Code Playgroud)

...

无需更换音轨,因为我们只对在保持音频输入不变的同时改变视觉效果感兴趣。

使用这种方法的好处是不需要对等方重新协商来切换视频源。

这种方法的另一个好处是您不需要停止 camStream。完成屏幕共享后,您可以使用以下方法切换回视频源:

videoSender.replaceTrack(camStream.getVideoTracks()[0]);
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看 replaceTrack 的文档

我有一个可用的 webrtc 会议解决方案,它使用这些类似的步骤支持屏幕共享和屏幕录制。你可以在这里查看

它在 Firefox 上开箱即用,但要使其在 chrome 上运行,您需要启用“实验性网络平台”标志(转到 chrome://flags/ )


Abd*_*man 4

localStream.stop();
peerconnection.removeStream(localStream);
Run Code Online (Sandbox Code Playgroud)

我能够通过以下步骤找到解决方案

  1. 删除当前流

  2. 添加新流

  3. 创建新报价

请注意,它removeStream已被弃用,不再出现在规范中,并且并未在所有浏览器中实现。例如,这在 Firefox 中不起作用。stream.stop()也被弃用,有利于stream.getTracks().forEach(track => track.stop())

  • 请注意,“removeStream”已被弃用,不再出现在规范中,并且并非在所有浏览器中实现。例如,这在 Firefox 中不起作用。`stream.stop()` 也已被弃用,取而代之的是 `stream.getTracks().forEach(track => track.stop())`。 (4认同)