Modern WebRTC replaceTrack(null) of audio

by Andreas Pehrson

HTML

<table><tr>
  <td><video id="v1" autoplay muted style="width:320px;height:240px;"></video></td>
  <td><video id="v2" autoplay style="width:320px;height:240px;"></video></td></tr>
  <tr><td id="v1info">0x0</td><td id="v2info">0x0</td></tr>
  <tr><td id="v1brinfo">0 bps</td><td id="v2brinfo">0 bps</td></tr>
  <tr><td></td><td id="v2maxbr">MAX 200000 bps</td></tr>
  <tr><td></td><td id="v2scaledownby">Downscaling x2</td></tr>
</table>
<button onclick="start()">Start!</button>
<br/>
<button onclick="toggleaudio()">Toggle Audio</button>
<br/>
<button onclick="decbr()">&lt;&lt; MaxBr</button>
<button onclick="incbr()">MaxBr &gt;&gt;</button>
<br/>
<button onclick="decscale()">&lt;&lt; ScaleDownBy</button>
<button onclick="incscale()">ScaleDownBy &gt;&gt;</button>
<div id="div"></div>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

JavaScript

const pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();
const constraints = { video: { width: 1280, height: 720 }, audio: true };
let trackV, trackA, senderV, senderA, receiverV, receiverA;
let maxBitrate = 200000;
let scaleResolutionDownBy = 2;

const setEncoderParams = async sender => {
  await sender.setParameters({ encodings: [encoding()] });
  log(JSON.stringify(sender.getParameters().encodings[0]));
};

const start = async () => {
  try {
    const stream = await navigator.mediaDevices.getUserMedia(constraints);
    set(v1, v1info, stream);
    trackV = stream.getVideoTracks()[0];
    trackA = stream.getAudioTracks()[0];
    senderV = pc1.addTrack(trackV, stream);
    senderA = pc1.addTrack(trackA, stream);
    setEncoderParams(senderV);
  } catch(e) { log(3); }
};
  
const toggleaudio = () => {
  if (senderA.track) {
    trackA.enabled = false;
    senderA.replaceTrack(null);
  } else {
    trackA.enabled = true;
    senderA.replaceTrack(trackA);
  }
};
  
const decbr = () => {
  maxBitrate = Math.max(10000, maxBitrate - 10000);
  setEncoderParams(senderV);
  update(v2maxbr, "MAX " + maxBitrate + " bps");
};

const incbr = () => {
  maxBitrate = Math.min(10000000, maxBitrate + 10000);
  setEncoderParams(senderV);
  update(v2maxbr, "MAX " + maxBitrate + " bps");
};

const decscale = () => {
  scaleResolutionDownBy = Math.max(1, scaleResolutionDownBy - 1);
  setEncoderParams(senderV);
  update(v2scaledownby, "Downscaling x" + scaleResolutionDownBy);
};

const incscale = () => {
  scaleResolutionDownBy = Math.min(100, scaleResolutionDownBy + 1);
  setEncoderParams(senderV);
  update(v2scaledownby, "Downscaling x" + scaleResolutionDownBy);
};

const encoding = () => {
  return {
    maxBitrate: maxBitrate,
    scaleResolutionDownBy: scaleResolutionDownBy,
  };
};
const dimensions = v => v.videoWidth +"x"+ v.videoHeight;
const set = async (v, vinfo, stream) => {
  try {
    v.srcObject = stream;
    v.onresize = () => console.log("resize", v.id,...