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

时间:2015-03-27 14:06:21

标签: webrtc

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

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

2 个答案:

答案 0 :(得分:5)

您提出了几个问题,其中大多数问题的简短答案是:尚未 (尽管请参阅下面的更新)。如果你想要一个前瞻性的答案,请继续阅读。

您没有指定浏览器,因此我会根据规范回答。实现方面仍然存在差异,因此这个答案可能毫无用处。

applyConstraints

The plan能够在活动会话期间更改约束,例如像这样:

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

但是,由于人们拥有不同能力的不同相机,因此您只能使用其硬件上可用的模式。

更新:Firefox 43实现了这一点。试试this fiddle

RTCRtpSender

The plan是为编码和传输添加控件到发件人对象:

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

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

更新:Firefox 48实现了这一点。试试this fiddle

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

RTCRtpSender.replaceTrack

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

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

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

答案 1 :(得分:4)

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

没有先获取参数,我总是会收到此错误:

$source

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

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

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