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()"><< MaxBr</button>
<button onclick="incbr()">MaxBr >></button>
<br/>
<button onclick="decscale()"><< ScaleDownBy</button>
<button onclick="incscale()">ScaleDownBy >></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,...