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

Aki*_*Aki 3 webrtc

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

编辑: 我发现getUserMedia支持minFrameRate和maxFrameRate参数.因此,当我的对等连接处于会话状态时,我可以调用getUserMedia吗?另一个相似的用例是,在我已经进入对等会话时能够更换摄像头吗?无需重新协商SDP,ICE,......这可行吗?

jib*_*jib 7

你问了几个问题,其中大部分都是简短的答案:还没有 (尽管见下文更新).如果你想要一个前瞻性的答案,那么请继续阅读.

您没有指定浏览器,因此我将根据规范进行回答.实现中仍存在差异,因此这个答案可能毫无用处.

applyConstraints

计划是能够在活动会话期间更改约束,例如:

var videotrack = stream_from_getUserMedia.getVideoTracks()[0];
videotrack.applyConstraints({ frameRate: { max: 10 } });
Run Code Online (Sandbox Code Playgroud)

但是,由于人们拥有不同能力的不同相机,因此您将受限于其硬件上可用的模式.

更新: Firefox 43实现了这一点.试试这个小提琴!

RTCRtpSender

计划是添加编码和传输控件到发送方对象:

var pc = RTCPeerConnection(config);

var encoding = { maxBitrate: 60000, scaleResolutionDownBy: 2 };

var videotrack = stream.getVideoTracks()[0];
var sender = pc.addTrack(videotrack, stream);
sender.setParameters({ encodings: [encoding] });
Run Code Online (Sandbox Code Playgroud)

编码阵列甚至可以扩展用于联播.

更新: Firefox 48实现了这一点.试试这个小提琴!

请注意,这在规范中是全新的,并且最终的API可能仍然会波动(具体而言,仍然不清楚是否setParameters可以在此类协商之前调用).谷歌浏览器可能有一些旧的比特率机制,但我不熟悉它.您认为,您的SDP解决方法是Chrome的现状.

RTCRtpSender.replaceTrack

计划是让您在正在进行的对等会话中替换摄像机轨道.你这样称呼它:

var videotrack2 = a_different_stream.getVideoTracks()[0];
sender.replaceTrack(videotrack2);
Run Code Online (Sandbox Code Playgroud)

它改变了遥控器所看到的东西,而不改变这一点.这是在Firefox中实现的.这是一个jsfiddle.只有具有持久权限时,此方法才适用.


DJ *_*use 6

对于像我一样(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);
Run Code Online (Sandbox Code Playgroud)

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