Changing a MediaStream of RTCPeerConnection Changing a MediaStream of RTCPeerConnection google-chrome google-chrome

Changing a MediaStream of RTCPeerConnection


To answer your first question, when modifying the MediaStream in an active peerconnection, the peerconnection object will fire an onnegotiationneeded event. You need to handle that event and re-exchange your SDPs. The main reason behind this is so that both parties know what streams are being sent between them. When the SDPs are exchanged, the mediaStream ID is included, and if there is a new stream with a new ID(event with all other things being equal), a re-negotiation must take place.

For you second question(about SSTREAM). It does indeed contain video tracks but there is no videotrack attribute for webkitMediaStreams. You can grab tracks via their ID, however.

Since there is the possibility of having numerous tracks for each media type, there is no single attribute for a videotrack or audiotrack but instead an array of such. The .getVideoTracks() call returns an array of the current videoTracks. So, you COULD grab a particular video track through indicating its index .getVideoTracks()[0].


I do something similar, on clicking a button I remove the active stream and add the other.

This is the way I do it and it works for me perfectly,

_this.rtc.localstream.stop();_this.rtc.pc.removeStream(_this.rtc.localstream);gotStream = function (localstream_aud){var constraints_audio={    audio:true   }_this.rtc.localstream_aud = localstream_aud;_this.rtc.mediaConstraints= constraints_audio;   _this.rtc.createOffer();}getUserMedia(constraints_audio, gotStream);gotStream = function (localstream){var constraints_screen={        audio:false,        video:{            mandatory:{                chromeMediaSource: 'screen'            }        }    }  _this.rtc.localstream = localstream;  _this.rtc.mediaConstraints=constraints_video;  _this.rtc.createStream();    _this.rtc.createOffer();}getUserMedia(constraints_video, gotStream);

Chrome doesn't allow audio along with the 'screen' so I create a separate stream for it.You will need to do the opposite in order to switch back to your older video stream or actually to any other stream you want.

Hope this helps