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

时间:2017-03-16 04:31:45

标签: javascript google-chrome video-streaming webrtc audio-streaming

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

我发现我可以使用MediaStreamTrack.applyConstraints()更改视频属性,但是可以更改视频源吗?还有更多我如何将视频添加到现有音频流。

我现在需要这个才能使用chrome。

5 个答案:

答案 0 :(得分:3)

localStream.stop();
peerconnection.removeStream(localStream);

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

  1. 删除当前流

  2. 添加新流

  3. 制作新优惠

  4. 请注意removeStream已弃用,不再在规范中,也未在所有浏览器中实现。例如。这在Firefox中不起作用。 {I}也弃用了stream.stop()

答案 1 :(得分:1)

到目前为止,对于您的情况,我觉得更好的方法是使用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上运行,您需要启用“ Experimental Web Platform”标志(转到chrome:// flags /)

答案 2 :(得分:0)

使用你的方法产生以下错误

代码如下:

  var camVideoTrack = options.attachStream.getVideoTracks()[0];
  var camAudioTrack = options.attachStream.getAudioTracks()[0];
  var videoSender = peer.addTrack(camVideoTrack, options.attachStream);
  var audioSender = peer.addTrack(camAudioTrack, options.attachStream);
  var videoTrack = stream.getVideoTracks()[0];
  videoSender.replaceTrack(videoTrack);

结果:

  adapter-latest.js:629 Uncaught (in promise) DOMException: Failed to execute 'addTrack' on 'RTCPeerConnection': A sender already exists for the track.
    at RTCPeerConnection.addTrack (https://education.abc.dev:9559/adapter-latest.js:629:31)

答案 3 :(得分:0)

代码如下:

  addMixedVideo: function(stream, peer) {
    if (!stream) return;
    
    var videoTrack = options.attachStream.getVideoTracks()[0];
    var sender = peer.getSenders().find(function(s) {
        return s.track.kind == videoTrack.kind;
    });
    console.log('addMixedVideo -- found sender: ', sender);
    
    var videoTrackMixer = stream.getVideoTracks()[0];
    sender.replaceTrack(videoTrackMixer);
},

答案 4 :(得分:-1)

获取 rtpSender,同时 addTrack 到 localPeerConnection

然后替换您需要的任何曲目

rtpSender.setTrack(camVideoTrack, true); //用于摄像头视频跟踪


rtpSender.setTrack(screenShareTrack, true); //用于屏幕共享 videoTrack