我正在尝试通过以下示例修改带宽:https://webrtc.github.io/samples/src/content/peerconnection/bandwidth/

但是,我在Chrome上收到此错误。

errorInvalidModificationError:在setParameters()中修改的只读字段

Firefox成功更改了带宽。几个月前,它也可以在Chrome上正常运行。突然收到此错误,我四处搜寻,但仍然找不到任何解决方案,请问我该如何解决此错误?谢谢。

var bandwidth = 500;

// Loop through each track
var i;
for (i = 0; i < peers[peer_id].getSenders().length; i++) {
    var sender = peers[peer_id].getSenders()[i];

    if(sender.track.kind === "video"){
        var parameters = sender.getParameters();

        if (!parameters.encodings) {
          parameters.encodings = [{}];
        }

        parameters.encodings = [{}];

        parameters.encodings[0].maxBitrate = bandwidth * 1000;

        sender.setParameters(parameters).then(success, error);

        function success(){
            console.log("bandwidth success adjust");
        };

        function error(err){
            console.log("bandwidth error"+err);
        };
    };
}

最佳答案

删除第二个parameters.encodings = [{}];它会意外删除encodings中的第一个编码的所有属性,其中某些属性是只读的,不允许修改。

pc.setParameters()方法要求其输入有效地来自pc.getParameters(),并且仅允许修改某些encodings属性。

它被设计为交易:

const parameters = pc.getParemeters();
// modify certain parameters only
await pc.setParemeters(parameters);


这由getParameters()强制执行,包括setParameters()进行检查的parameters.transactionId。如果修改了它或某些其他只读属性,则会得到InvalidModificationError

Firefox太宽容

Firefox实施的API的早期版本过于宽大。 Bug 1401592跟踪解决此问题。

由于Firefox,仅需要以下行:

  if (!parameters.encodings) {
    parameters.encodings = [{}];
  }


因为只有在Firefox中,从encodings返回的getParameters()永远为空。

在Chrome和规范中,保证encodings存在并且至少包含一项。

关于javascript - WebRTC更改带宽,在Chrome上收到InvalidModificationError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57400849/

10-12 15:17