现在我在商品SDP中使用b = AS:1000来设置上游视频的上限(即1Mbps),以控制我发送给远程对等体的视频量。我正在寻找一种不同的方法,所以我想知道是否有办法在当前活动视频会话中控制视频帧速率?
修改 我发现getUserMedia支持minFrameRate和maxFrameRate参数。因此,当我的对等连接处于会话状态时,我可以调用getUserMedia吗?另一个相似的用例是,在我已经进入对等会话时能够更换摄像头吗?无需重新协商SDP,ICE,......这可行吗?
答案 0 :(得分:5)
您提出了几个问题,其中大多数问题的简短答案是:尚未 (尽管请参阅下面的更新)。如果你想要一个前瞻性的答案,请继续阅读。
您没有指定浏览器,因此我会根据规范回答。实现方面仍然存在差异,因此这个答案可能毫无用处。
The plan能够在活动会话期间更改约束,例如像这样:
var videotrack = stream_from_getUserMedia.getVideoTracks()[0];
videotrack.applyConstraints({ frameRate: { max: 10 } });
但是,由于人们拥有不同能力的不同相机,因此您只能使用其硬件上可用的模式。
更新:Firefox 43实现了这一点。试试this fiddle!
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的现状。
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带宽相关的问题。