- From: Jan-Ivar Bruaroey via GitHub <sysbot+gh@w3.org>
- Date: Fri, 15 Feb 2019 15:24:16 +0000
- To: public-webrtc-logs@w3.org
From [Exploring RTCRtpTransceiver](https://blog.mozilla.org/webrtc/rtcrtptransceiver-explored/) blog post, under the "Well-defined transceiver order" sub-heading: > ### Well-defined transceiver order. > Something I overlooked last year is that `transceiver.mid` is `null` before `setLocalDescription`. We avoided that problem above by establishing the connection ahead of sending anything, but this makes `mid` useless for correlating in the initial negotiation. > > The good news here since last year is that `pc.getTransceivers()` order is now well-defined! Transceivers always appear in creation-order, whether introduced by you with `addTransceiver`, or in m-line order from `setRemoteDescription`. That m-line order matches the other side’s transceiver order, at least initially. > > With some care, this means we can correlate tracks using transceiver order from the initial offer itself. Here’s an example—without check-boxes this time—that does that. We’re also introducing a microphone into the picture: > ```js > let camStream; > > (async () => { > try { > const [pc1, pc2] = localPeerConnectionLoop(); > camStream = await navigator.mediaDevices.getUserMedia({video: true, audio: true}); > let transceivers = [ > pc1.addTransceiver(camStream.getVideoTracks()[0], {streams: [camStream]}), > pc1.addTransceiver(camStream.getAudioTracks()[0], {streams: [camStream]}), > pc1.addTransceiver(whiteNoise()) > ]; > > pc2.ontrack = ({transceiver, streams: [stream]}) => { > if (transceiver.mid == pc2.getTransceivers()[2].mid) { > videoB.srcObject = new MediaStream([transceiver.receiver.track]); > } else { > videoA.srcObject = stream; > } > } > } catch (e) { > console.log(e) > } > })(); > ``` > In the “Result” tab, you’ll see the camera on the left again. You can mute the audio in that video element as well. > > This time in `pc2.ontrack`, we don’t cheat by looking at the other side’s `transceivers`. We only look at our own `pc2.getTransceivers()` which is **guaranteed to be in the same order here**. > > Specifically, we look if this is the third transceiver (`pc2.getTransceivers()[2]`), and if so, put it on the right, otherwise left. We also use the `streams` argument to intuitively group the camera and microphone tracks together. Since the third track didn’t have a stream in this case, we could have keyed off of that difference instead. There may be several ways to correlate at times: by transceiver order, by stream, or by out-of-band `mid`. > > If you’re wondering how we can access the third transceiver already in the first `ontrack`, the API guarantees that `setRemoteDescription` is effectively done by the time the `track` events all fire. All transceivers are there; all tracks are in their streams. -- GitHub Notification of comment by jan-ivar Please view or discuss this issue at https://github.com/w3c/webrtc-pc/issues/2092#issuecomment-464088917 using your GitHub account
Received on Friday, 15 February 2019 15:24:18 UTC