5

In a Nutshell: I'm trying to change the VideoTrack of a MediaStream object.

(Documentation: https://developer.mozilla.org/en-US/docs/WebRTC/MediaStream_API)

I have a MediaStream object __o_jsep_stream_audiovideo which is created by the sipml library.

__o_jsep_stream_audiovideo looks like this:

stream object

So it has one AudioTrack and one VideoTrack. At first the VideoTrack comes from the users camera (e.g label: "FaceTime Camera").

According to the Documentation:

A MediaStream consists of zero or more MediaStreamTrack objects, representing various audio or video tracks.

So we should be fine adding more Tracks to this Stream.

I'm trying to switch/exchange the VideoTrack with that from another stream. The other stream (streamB) originates from Chromes ScreenCapture api (label: "Screen")

streamB

I tried:

__o_jsep_stream_audiovideo.addTrack(streamB.getVideoTracks()[0])

which doesn't seem to have any effect.

I also tried assigning the videoTracks directly (which was desperate I know).

I must be missing something obvious could you point me in the right direction?

I'm running

  • Chrome (Version 34.0.1847.131) and
  • Canary (Version 36.0.1976.2 canary)
  • OSX 10.9.2
admdrew
  • 3,790
  • 4
  • 27
  • 39
wpp
  • 7,093
  • 4
  • 33
  • 65
  • are you handling the `onaddtrack` event in the mediastream object? – Benjamin Trent May 06 '14 at 15:00
  • @bwtrent that could the problem I'm not handling it. How should I go about that? – wpp May 06 '14 at 15:09
  • actually, this [looks like a bug](https://code.google.com/p/webrtc/issues/detail?id=871) – Benjamin Trent May 06 '14 at 15:18
  • You may have to re-negotiate the stream so that the remote side gets the new track. But, the simplest solution would be to simply add the stream to the peer connection and not modify the tracks... – Benjamin Trent May 06 '14 at 15:28
  • Thanks for pointing me to that issue. It seems like the local media stream modifications (adding/removing tracks) are ignored (for now). I guess I'll try to add the second stream (as you suggested). I'll let you know. thanks again @bwtrent – wpp May 06 '14 at 15:35

2 Answers2

2

When you talk about change video track, we mean 2 areas:

  1. change the remote video track (what the others can see from u)

WebRTC gets new version of doing that, since it deprecates addStream/removeStream. However, the excelence is that they introduce new interface replaceTrack

stream.getTracks().forEach(function(track) {
    // remote
    qcClient.calls.values().forEach(function(call) {
    var sender = call.pc.getSenders().find(function(s) {
        return s.track.kind == track.kind;
    });
    sender.replaceTrack(track);
    });
});
  1. change your display video (You see yourself)

Better to just add a new video element (or using existing video element) But assign srcObject to the new captured stream

Xin
  • 33,823
  • 14
  • 84
  • 85
1

Adding and removing tracks on a MediaStream object do not signal a renegotiation and there are also issues with a MediaStream having two tracks of the same type in chrome.

You should probably just add the separate mediastream to the peer connection so that it can fire a re-negotiation and handle the streams. The Track add/remove functionality in chrome is very naive and not very granular and you should move away from it as much as you can.

Benjamin Trent
  • 7,378
  • 3
  • 31
  • 41
  • Thanks again. Although I was able to exchange the videoTracks of the MediaStream, it doesn't trigger a renegotiation. So you answered my original question. – wpp May 07 '14 at 08:28
  • 1
    as of today, adding or removing tracks on a mediastream triggers renegotiation – Anthony Mar 27 '19 at 07:12