Once a RTCPeerConnection is connected to a remote peer, it is possible to
stream audio and video between them. This is the point where we connect the
stream we receive from getUserMedia() to the RTCPeerConnection. A media
stream consists of at least one media track, and these are individually added
to the RTCPeerConnection when we want to transmit the media to the remote
peer.
const localStream = await getUserMedia({video: true, audio: true});
const peerConnection = new RTCPeerConnection(iceConfig);
localStream.getTracks().forEach(track => {
peerConnection.addTrack(track, localStream);
});
Tracks can be added to a RTCPeerConnection before it has connected to a remote
peer, so it makes sense to perform this setup as early as possible instead of
waiting for the connection to be completed.
Adding remote tracks
To receive the remote tracks that were added by the other peer, we register a
listener on the local RTCPeerConnection listening for the track event. The
RTCTrackEvent contains an array of MediaStream objects that have the same
MediaStream.id values as the peer's corresponding local streams. In our
example, each track is only associated with a single stream.
Note that while MediaStream IDs match on both sides of the peer connection,
the same is generally not true for MediaStreamTrack IDs.
const remoteVideo = document.querySelector('#remoteVideo');
peerConnection.addEventListener('track', async (event) => {
const [remoteStream] = event.streams;
remoteVideo.srcObject = remoteStream;
});