关闭 googCpuOveruseDetection 解决 RTCPeerConnection 输出分辨率自动变化问题

863 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

先说结论:通过设置 RTCPeerConnectiongoogCpuOveruseDetection: false 选项可以关闭分辨率自动调节功能,满足一些需要保持视频分辨率的业务需求。

参考代码:

    new RTCPeerConnection(
      {
        iceTransportPolicy: 'all',
        bundlePolicy: 'max-bundle',
        rtcpMuxPolicy: 'require',
        iceCandidatePoolSize: '0',
        sdpSemantics: 'unified-plan',
        tcpCandidatePolicy: 'disable',
        IceTransportsType: 'nohost',
      },
      { optional: [{ googCpuOveruseDetection: false }] },
    );

问题描述

基于 SRS 的 WebRTC 推流做了个破产版的 vmix,使用 USB 摄像头推流到 SRS ,然后转成 RTMP 进行直播和录像。

image.png

开发的过程中遇到一个问题,虽然使用 getUsernMedia 或者到的 MediaStream 的分辨率是 1080P 的,网络和电脑性能也满足要求,但是后端收到的流分辨率会先比较小,然后慢慢变道 1080P,我们的业务系统中,分辨率切切换会导致录像业务出问题。

使用 chrome://webrtc-internals/ 查看信息可以看到变化过程。

image.png

解决方案

寻找解决方案的时候找到了下面的讨论,知道了 googCpuOveruseDetection 参数可以关闭 chrome 自动调整 WebRTC 输出分辨率。

groups.google.com/g/discuss-w…

image.png

stackoverflow.com/questions/3…

测试效果

修改代码,增加 googCpuOveruseDetection 参数配置。

    new RTCPeerConnection(
      {
        iceTransportPolicy: 'all',
        bundlePolicy: 'max-bundle',
        rtcpMuxPolicy: 'require',
        iceCandidatePoolSize: '0',
        sdpSemantics: 'unified-plan',
        tcpCandidatePolicy: 'disable',
        IceTransportsType: 'nohost',
      },
      { optional: [{ googCpuOveruseDetection: false }] },
    );

使用 chrome://webrtc-internals/ 查看更改后的情况

image.png

可以看到输出的分辨率一开始就是 1080P 的了,没有了之前的变化过程,在业务系统中查看日志证明了方案 OK。