const videobitrate = 20000;
var offer = pc.localDescription;
// Set bandwidth for video
offer.sdp = offer.sdp.replace(/(m=video.*\r\n)/g, `$1b=AS:${videobitrate}\r\n`);
pc.setLocalDescription(offer);
function handle_offer_sdp(offer) {
let sdp = offer.sdp.split('\r\n');//convert to an concatenable array
let new_sdp = '';
let position = null;
sdp = sdp.slice(0, -1); //remove the last comma ','
for(let i = 0; i < sdp.length; i++) {//look if exists already a b=AS:XXX line
if(sdp[i].match(/b=AS:/)) {
position = i; //mark the position
}
}
if(position) {
sdp.splice(position, 1);//remove if exists
}
for(let i = 0; i < sdp.length; i++) {
if(sdp[i].match(/m=video/)) {//modify and add the new lines for video
new_sdp += sdp[i] + '\r\n' + 'b=AS:' + '128' + '\r\n';
}
else {
if(sdp[i].match(/m=audio/)) { //modify and add the new lines for audio
new_sdp += sdp[i] + '\r\n' + 'b=AS:' + 64 + '\r\n';
}
else {
new_sdp += sdp[i] + '\r\n';
}
}
}
return new_sdp; //return the new sdp
}
pc.createOffer(function(offer) {
offer.sdp = handle_offer_sdp(offer); //invoke function saving the new sdp
pc.setLocalDescription(offer);
}, function(error) {
console.log('error -> ' + error);
});
9条答案
按热度按时间sbtkgmzw1#
尝试this demo。您可以在会话描述中插入带宽属性(
b=AS
):b=AS
已经存在于data m-line
SDP中;其默认值为50
。于2015年9月23日更新
以下是一个可完全控制音频/视频轨道比特率的库:
这是库代码。它相当大,但它的工作!
以下是如何设置高级opus比特率参数:
hpcdzsge2#
更新的答案
说明:
a=mid:video
不是一个保证的标记。对于只接收视频,您可能看不到它或看到a=mid:0
。通常,最好查找m=video xxxx xxxx
(或类似的音频)标记并在下面附加带宽参数f4t66c6m3#
不确定这是否有帮助,但您可以通过getUserMedia限制视频分辨率:请参见simpl.info/getusermedia/constraints/上演示。
3lxsmp7m4#
我的答案不是node.js,但可能有人在开发一个本地手机应用程序(iOS、Android)时,一直在控制webrtc带宽。
因此,至少在iOS的 GoogleWebRTC(1.1.31999) 版本和Android的 org.webrtc:google-webrtc:1.0.22672 版本中,PeerConnection示例中存在方法。
对于iOS:
对于Android,分别为:
6l7fqoea5#
这取决于你使用的SFU媒体服务器,但简而言之,你的媒体服务器需要告诉客户端浏览器它应该发送的最大比特率,通过在 answer SDP中设置带宽属性,以及在它定期发送的REMB消息中设置带宽属性。
REMB(receiver estimated maximum bitrate)分别适用于音频和视频流(至少在我测试过的桌面Chrome和Firefox上是这样的)。所以如果REMB设置为75 kps,并且你有一个音频流和一个视频流,那么每个流都将限制在75 kps,总传输比特率为150 kps。你应该使用chrome://webrtc-internals来测试和验证这一点。
如果您使用OPUS作为音频编解码器,您可以通过在 answer SDP中设置maxaveragebitrate属性来单独控制音频带宽。设置此属性将覆盖REMB值(在Chrome上验证)。因此,您可以将音频比特率设置为16 kps,将视频比特率(通过REMB)设置为134 kps,以使组合传输比特率为150。
注意REMB是由服务器发送的,因此服务器需要支持它。其他SDP属性可以在客户端通过修改收到的 answer SDP来操作,然后将其传递给setRemoteDescription()。
这是我基于网上调查的有限理解,并不是基于对技术堆栈的深入了解,所以请持保留态度。
kyvafyod6#
您还应该能够在流(see this demo)上使用带宽限制,但它似乎不起作用,即使在最新的canary(29.0.1529.3)中也是如此。
在discuss-webrtc邮件列表上有一些关于基于SDP的方法的讨论,它链接到WebRTC bug 1846。
q5lcpyga7#
我昨天做了它,它的工作就像一个魅力!在我的情况下,它是需要防止缓慢和旧手机得到冻结在视频通话!看看
mnemlml88#
我建议按此处所述更改
maxBitrate
属性的值https://stackoverflow.com/a/71223675/1199820lsmepo6l9#
看看这个,这个对我有用。
通过getSenders()控制您的比特率,在对等体连接后,您可以设置您的最大比特率。
这种方法允许您在不重新协商的情况下控制比特率。因此,您可以在通话过程中更改流媒体质量。
Reference code & demo