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

Electron 15+录屏时MediaRecorder.start()内存占用过高问题求助

解决方案:Electron 15+录屏MediaRecorder内存飙升与卡顿问题
  • 及时写入磁盘,避免Blob内存堆积
    MediaRecorder的ondataavailable事件会持续生成Blob片段,如果把所有片段存在内存数组里,长时间录制必然导致内存爆炸。直接把片段写入本地文件是最有效的解决方式:
const fs = require('fs');
const outputStream = fs.createWriteStream('./recording.webm');

mediaRecorder.ondataavailable = (e) => {
  if (e.data.size > 0) {
    // 将Blob转成Buffer写入流,不占用内存存储
    e.data.arrayBuffer().then(buf => {
      outputStream.write(Buffer.from(buf));
    });
  }
};

mediaRecorder.onstop = () => {
  outputStream.end();
};
  • 调低视频编码参数
    过高的比特率、分辨率或帧率会让每帧数据量暴增,直接拉高内存占用。初始化MediaRecorder时指定合理的编码配置:
const recordOptions = {
  mimeType: 'video/webm; codecs=vp9',
  videoBitsPerSecond: 1500000, // 1.5Mbps,根据屏幕分辨率调整
  audioBitsPerSecond: 96000,
  frameRate: 25
};
const mediaRecorder = new MediaRecorder(stream, recordOptions);
  • 禁用GPU加速(针对内存泄漏场景)
    Electron 15+的GPU加速可能和MediaRecorder存在兼容性问题,导致编码时内存泄漏。在主进程启动时添加参数禁用:
const { app } = require('electron');
app.commandLine.appendSwitch('disable-gpu');
app.commandLine.appendSwitch('disable-hardware-encoding');
  • 清理闲置媒体轨道
    录制过程中如果有未使用的音频/视频轨道,及时停止并释放资源,避免内存占用:
// 停止录制时清理所有轨道
stream.getTracks().forEach(track => {
  track.stop();
});
  • 使用Electron原生desktopCapturer的正确姿势
    获取屏幕流时,约束参数不要设置过高,只请求需要的轨道(比如不需要音频就关闭):
const { desktopCapturer } = require('electron');

async function getScreenStream() {
  const sources = await desktopCapturer.getSources({ types: ['screen'] });
  return navigator.mediaDevices.getUserMedia({
    audio: false,
    video: {
      mandatory: {
        chromeMediaSource: 'desktop',
        chromeMediaSourceId: sources[0].id,
        maxWidth: 1920,
        maxHeight: 1080,
        frameRate: 25
      }
    }
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:05:22