现在我在商品SDP中使用b = AS:1000来设置上游视频的上限(即1Mbps),以控制我发送给远程对等体的视频量.我正在研究一种不同的方法,所以我想知道是否有办法在当前活动视频会话中控制视频帧速率?
编辑: 我发现getUserMedia支持minFrameRate和maxFrameRate参数.因此,当我的对等连接处于会话状态时,我可以调用getUserMedia吗?另一个相似的用例是,在我已经进入对等会话时能够更换摄像头吗?无需重新协商SDP,ICE,......这可行吗?
你问了几个问题,其中大部分都是简短的答案:还没有 (尽管见下文更新).如果你想要一个前瞻性的答案,那么请继续阅读.
您没有指定浏览器,因此我将根据规范进行回答.实现中仍存在差异,因此这个答案可能毫无用处.
计划是能够在活动会话期间更改约束,例如:
var videotrack = stream_from_getUserMedia.getVideoTracks()[0];
videotrack.applyConstraints({ frameRate: { max: 10 } });
Run Code Online (Sandbox Code Playgroud)
但是,由于人们拥有不同能力的不同相机,因此您将受限于其硬件上可用的模式.
更新: Firefox 43实现了这一点.试试这个小提琴!
计划是添加编码和传输控件到发送方对象:
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的现状.
计划是让您在正在进行的对等会话中替换摄像机轨道.你这样称呼它:
var videotrack2 = a_different_stream.getVideoTracks()[0];
sender.replaceTrack(videotrack2);
Run Code Online (Sandbox Code Playgroud)
它改变了遥控器所看到的东西,而不改变这一点.这是在Firefox中实现的.这是一个jsfiddle.只有具有持久权限时,此方法才适用.
对于像我一样(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 带宽相关问题来说,这仍然是一个很好的答案。
| 归档时间: |
|
| 查看次数: |
4546 次 |
| 最近记录: |