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
相关产品推荐
相关产品推荐

