You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron desktopCapturer窗口捕获卡顿高延迟 全屏捕获正常

问题产生原因

Electron单窗口捕获和全屏捕获调用的系统底层接口存在本质差异,是卡顿的核心诱因:

  • 全屏捕获默认调用系统DXGI桌面复制接口(Windows平台)/ 屏幕录制内核接口(macOS平台),原生支持硬件加速,帧率可轻松达到配置阈值,无卡顿问题。
  • Electron 22以前的版本,单窗口捕获默认走老旧的BitBlt GDI抓屏通道,该通道对开启硬件加速渲染的窗口(包括Electron应用、Chrome/Edge、UWP应用、游戏等)兼容性极差,帧率会被系统强制限制在15fps左右,你在媒体约束中配置的minFrameRate/maxFrameRate参数在这个捕获路径下完全不生效。
  • 你之前怀疑的「getSource()放在createWindow()内部调用」不是故障原因,相同写法下全屏捕获运行正常即可排除该因素。
解决方法

按优先级依次尝试:

  • 升级Electron到22.0.0及以上稳定版本,在主进程代码最开头(app.whenReady()执行前)添加启动参数,开启高性能WGC窗口捕获通道,这个通道和全屏捕获走一样的硬件加速逻辑,支持帧率配置,延迟和帧率表现和全屏捕获完全一致:
const { app } = require('electron')
// 开启WGC窗口捕获
app.commandLine.appendSwitch('enable-features', 'DesktopCaptureWgcWindowCapturer')
  • 优化getSources调用逻辑:如果当前场景只需要捕获窗口,就把getSources的types参数从["window", "screen"]改成["window"],减少不必要的屏幕源枚举开销;不要高频重复调用getSources,仅在初始化、切换捕获源的时候调用一次即可,每次调用都会触发系统枚举所有顶层窗口,频繁调用会阻塞主进程拉高延迟。
  • 给承载捕获视频流的渲染窗口添加配置,避免后台降帧:在创建对应BrowserWindow的时候添加backgroundThrottling: false参数,禁止Electron在窗口失焦/后台的时候限制渲染帧率。
  • 如果暂时无法升级Electron版本,可以使用兼容方案:捕获目标窗口所在的完整屏幕,通过getWindowBounds()实时获取目标窗口的位置、尺寸,对视频流做裁剪,这种方式走全屏捕获的高性能通道,帧率稳定,缺点是需要额外监听窗口移动、缩放、最小化事件同步更新裁剪区域。

注意:如果是macOS平台出现同类问题,先确认已经给Electron应用开启「屏幕录制」权限,权限缺失的情况下单窗口捕获会走降级路径,也会出现低帧率高延迟问题。

内容的提问来源于stack exchange,提问作者HasanTheSyrian_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:06:16