未捕获(承诺)DOMException:在 setParameters() 中修改的只读字段

Uncaught (in promise) DOMException: Read-only field modified in setParameters()

这是我的代码


function createPeer(userID) {
    const peer = new RTCPeerConnection({
        iceServers: [
            {
                urls: "stun:stun.stunprotocol.org"
            },
            {
                urls: 'turn:numb.viagenie.ca',
                credential: 'redacted',
                username: 'webrtc@live.com'
            },
        ]
    });
    peer.onicecandidate = () => { };
    peer.ontrack = () => { };
    peer.onnegotiationneeded = () => { };

    return peer;
}

navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(stream => {
    const peer = createPeer();
    peer.getSenders();
    stream.getTracks().forEach(track => peer.addTrack(track, stream));
    peer.getSenders().forEach(sender => {
        if (sender.track.kind === "video") {
            const params = sender.getParameters();
            params.encodings.push({
                maxBitrate: 100
            });
            sender.setParameters(params);
        }
    })
});

我不明白为什么会出现错误

Uncaught (in promise) DOMException: Read-only field modified in setParameters().

我认为比特率是我可以改变的。此外,我正在通过调用 sender.getParameters(); 来更改我获得的参数,这是 mdn docs 所说的。

我哪里错了?

您正在向数组添加新编码,而不是修改现有编码。您需要等到协商完成后(您应用了答案),然后执行:

    peer.getSenders().forEach(sender => {
        if (sender.track.kind === 'video') {
            let params = sender.getParameters();
            params.encodings.forEach(e => {
                e.maxBitrate = 100;
            });
            sender.setParameters(params);
        }
    })