一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
先说结论:通过设置 RTCPeerConnection
的 googCpuOveruseDetection: 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 进行直播和录像。
开发的过程中遇到一个问题,虽然使用 getUsernMedia 或者到的 MediaStream 的分辨率是 1080P 的,网络和电脑性能也满足要求,但是后端收到的流分辨率会先比较小,然后慢慢变道 1080P,我们的业务系统中,分辨率切切换会导致录像业务出问题。
使用 chrome://webrtc-internals/
查看信息可以看到变化过程。
解决方案
寻找解决方案的时候找到了下面的讨论,知道了 googCpuOveruseDetection
参数可以关闭 chrome 自动调整 WebRTC 输出分辨率。
groups.google.com/g/discuss-w…
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/
查看更改后的情况
可以看到输出的分辨率一开始就是 1080P 的了,没有了之前的变化过程,在业务系统中查看日志证明了方案 OK。