Right now I use the b=AS:1000 in the offer SDP to set the upper limit(i.e. 1Mbps) for the upstream video to control the amount of video I am sending to the remote peer. I am looking into a different approach, so I was wondering if there is a way to control video frame rate on the fly of the current active video session?
EDIT: I found out that getUserMedia supports minFrameRate and maxFrameRate parameters. So can I call getUserMedia while my peer connection is in session? Another similar use case, which find reasonable, is to be able to change the camera while I am already in a peer session? Without having to renegotiate SDPs, ICE, ... Is this doable?
You're asking several questions, and when this answer was first written, the short answer to most of them was: not yet (though I've since updated it thanks to DJ House's answer below!).
You should be able to alter constraints during an active session, using applyConstraints like this:
const videotrack = stream_from_getUserMedia.getVideoTracks()[0];
videotrack.applyConstraints({ frameRate: { max: 10 } });
Most implementations today are able to decimate frame rates and not just deliver the modes available in the camera.
Try this fiddle.
You should be able to control encoding & transmission in the sender object using setParameters:
const pc = RTCPeerConnection(config);
const videotrack = stream.getVideoTracks()[0];
const sender = pc.addTrack(videotrack, stream);
// get the current parameters first
const params = sender.getParameters();
if (!params.encodings) params.encodings = [{}]; // Firefox workaround!
params.encodings[0].maxBitrate = 60000;
params.encodings[0].scaleResolutionDownBy = 2;
sender.setParameters(params);
encodings
is an array, but unless simulcast is used, there's just one entry.
Try this fiddle! (tested in Chrome, Firefox, Safari & Edge!)
You should also be able to replace the camera track in an ongoing peer session, like this:
const videotrack2 = a_different_stream.getVideoTracks()[0];
await sender.replaceTrack(videotrack2);
It alters what the remote sees, without altering things at this end. Try it in this fiddle.
For anyone who ends up here like I did (5 years later), I needed to get the parameters before setting them. I am assuming since this was such an old question that the API just got a little out dated.
Without getting the parameters first, I always got this error:
Failed to execute 'setParameters' on 'RTCRtpSender': required member codecs is undefined.
Here's a quick way to get and manipulate the current parameters:
var pc = RTCPeerConnection(config);
var videotrack = stream.getVideoTracks()[0];
var sender = pc.addTrack(videotrack, stream);
// get the current parameters first
var params = sender.getParameters();
params.encodings[0].maxBitrate = 60000;
params.encodings[0].scaleResolutionDownBy = 2;
sender.setParameters(params);
This was still a great answer for me to quickly debug some Webrtc bandwidth related issues.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With