react-native下mediasoup设备输出码率限制不生效问题求助
两个配置方案的问题
- 第一种方案:
setRtpEncodingParameters调用时机错误。mediasoup要求RTP编码参数必须在调用produce方法初始化生产者时传入,生产完成后再调用该方法修改参数不会触发编码配置重新协商,因此不生效。此外mediasoup v3+已不推荐通过该方法动态修改码率。 - 第二种方案:存在三个问题:
- 若你开启了Simulcast多档编码,仅配置单档
encodings的maxBitrate不生效,其余档位会使用默认高码率配置; - 仅配置了发送端码率限制,没有同步配置服务端的码率规则,mediasoup服务端的带宽估计、重传、FEC冗余等逻辑都会导致接收端观测码率超出发送端限制;
- 示例代码中
mediaType: ‘camera’使用了中文全角引号,若实际代码未修改会触发语法错误。
- 若你开启了Simulcast多档编码,仅配置单档
正确实现码率限制的步骤
1. 发送端(客户端)配置
如果使用单档编码(未开Simulcast),直接在produce的参数中配置encodings即可,注意maxBitrate单位为bit/s:
const videoTrack = localStream.getVideoTracks()[0]; const params = { track: videoTrack, encodings: [ { maxBitrate: 500000, // 示例为500kbps,按需调整,不要设置过低(如50kbps浏览器无法编码会自动忽略限制) maxFramerate: 30 // 可选,搭配限制帧率可让码率控制更稳定 } ], zeroRtpOnPause: true, appData: { mediaType: 'camera' }, disableTrackOnPause: true }; cameraProducer = await producerLocalTransport.produce(params);
如果开启了Simulcast多档编码,需要给每个档位单独设置码率上限:
const params = { track: videoTrack, encodings: [ { maxBitrate: 100000, scaleResolutionDownBy: 4 }, // 低清档100kbps { maxBitrate: 300000, scaleResolutionDownBy: 2 }, // 中清档300kbps { maxBitrate: 800000 } // 高清档800kbps ], zeroRtpOnPause: true, appData: { mediaType: 'camera' }, disableTrackOnPause: true }; cameraProducer = await producerLocalTransport.produce(params);
2. 服务端配置(必做,否则接收端码率仍可能偏高)
全局码率限制:创建Router时配置媒体编码的码率范围
const router = await worker.createRouter({ mediaCodecs: [ { kind: 'video', mimeType: 'video/H264', clockRate: 90000, parameters: { 'x-google-start-bitrate': 500000, // 初始码率 'x-google-max-bitrate': 1000000, // 全局最大视频码率1Mbps 'x-google-min-bitrate': 100000 // 全局最小视频码率100kbps } } ] });
单Transport码率限制:创建消费者Transport时配置最大入站码率
const consumerTransport = await router.createWebRtcTransport({ listenIps: [ { ip: '服务端内网IP', announcedIp: '服务端公网IP' } ], enableUdp: true, enableTcp: true, preferUdp: true, maxIncomingBitrate: 1000000 // 该传输通道下所有消费者最大接收码率1Mbps });
单消费者码率限制:单独给指定Consumer设置码率上限
await videoConsumer.setPreferredBitrate(500000); // 该消费者最大接收码率500kbps
排查建议
使用Chrome的webrtc-internals优先查看发送端outbound-rtp的实际输出码率,如果发送端已经达到你设置的上限,但接收端码率偏高,说明是服务端重传、FEC冗余包导致,可根据业务需要降低NACK重传频率、关闭不必要的FEC即可。
内容的提问来源于stack exchange,提问作者AsaadAlMawla
相关产品推荐
相关产品推荐

