在webrtc中实时控制视频发送帧速率

Control video send framerate on the fly in webrtc

本文关键字:帧速率 视频 实时控制 webrtc      更新时间:2023-09-26

现在我使用offer SDP中的b=AS:1000来设置上游视频的上限(即1Mbps),以控制我发送到远程对等端的视频量。我正在研究一种不同的方法,所以我想知道是否有一种方法可以控制当前活动视频会话的视频帧速率?

编辑:我发现getUserMedia支持minFrameRate和maxFrameRate参数。因此,当我的对等连接处于会话中时,我可以调用getUserMedia吗?另一个类似的用例是,当我已经在进行同伴会话时,可以更换相机,这是合理的吗?无需重新协商SDP、ICE。。。这可行吗?

你问了几个问题,当这个答案第一次写出来时,大多数问题的简短答案是:还没有(尽管由于下面DJ House的回答,我已经更新了它!)

应用约束

您应该能够在活动会话期间使用类似以下的applyConstraints来更改约束:

const videotrack = stream_from_getUserMedia.getVideoTracks()[0];
videotrack.applyConstraints({ frameRate: { max: 10 } });

如今的大多数实现都能够大幅降低帧速率,而不仅仅是提供相机中可用的模式。

试试这把小提琴。

RTCRtpSender

你应该能够控制编码&使用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是一个数组,但除非使用联播,否则只有一个条目。

试试这把小提琴!(在Chrome、Firefox、Safari和Edge中测试!)

RTCRtpSend.replaceTrack

您还应该能够在正在进行的对等会话中替换相机轨迹,如下所示:

const videotrack2 = a_different_stream.getVideoTracks()[0];
await sender.replaceTrack(videotrack2);

它改变了遥控器看到的东西,而没有改变这一端的东西。试试这把小提琴。

对于任何像我一样(5年后)来到这里的人,我需要在设置参数之前获取参数。我认为,由于这是一个如此古老的问题,API只是有点过时了。

在没有先获取参数的情况下,我总是会出现以下错误:

Failed to execute 'setParameters' on 'RTCRtpSender': required member codecs is undefined.

以下是获取和操作当前参数的快速方法:

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);

对于我来说,这仍然是一个很好的答案,可以快速调试一些与Webrtc带宽相关的问题。