Electron在MacOS Ventura M1设备上调用getUserMedia加载缓慢问题
问题概述
基于 Electron 15.5.4 开发的相机应用,在 x86 机器以 x64 架构构建后,于搭载 macOS 12.6(Ventura)的 M1 设备上出现异常:相机加载耗时长达8-10秒,甚至触发报错:
NotReadableError: Failed to allocate videosource
已完成排查:
- M1 本地构建的应用可正常运行,但业务要求必须保留 x86 机器 x64 架构的构建方式
- x86 机器构建 arm64 架构无法解决该问题
- 仅保留相机功能的极简测试应用仍出现相同问题
可行解决方案尝试
1. 升级 Electron 版本
Electron 15 属于旧版本,对 macOS Ventura 和 Apple Silicon 芯片的兼容性支持不足。建议升级至 Electron 19+ 版本(官方在 19.x 及后续版本中针对 Apple Silicon 和 Ventura 做了针对性优化),同时同步升级 electron-builder 至兼容版本(如 24.x+)。
新版本的 Chromium 内核优化了媒体设备的资源分配机制,可直接解决 Failed to allocate videosource 这类资源分配失败问题。
2. 优化媒体设备约束配置
当前固定宽高的视频约束可能导致 M1 设备相机需额外时间做分辨率适配,甚至触发资源分配异常。可修改约束为优先匹配设备原生支持的参数,或添加 fallback 逻辑:
const constraints = { audio: true, video: { width: { ideal: 800, max: 800 }, height: { ideal: 600, max: 600 }, facingMode: 'user' // 明确指定前置摄像头,减少设备枚举耗时 } };
若对分辨率要求不严格,可使用更灵活的配置让系统自动选择最优参数:
const constraints = { audio: true, video: true };
3. 调整 BrowserWindow 配置
尝试优化 webPreferences 配置以提升资源分配稳定性,建议逐步迁移至安全配置(开启上下文隔离与沙箱):
mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: false, // 建议关闭,改用 preload 脚本暴露必要 API contextIsolation: true, sandbox: true, preload: path.join(__dirname, 'preload.js') }, });
若暂时无法迁移,可尝试显式启用 WebRTC 相关配置:
webPreferences: { // 原有配置 nodeIntegration: true, contextIsolation: false, enableWebRtc: true }
4. 优化 Rosetta 2 兼容环境
由于 x64 架构应用在 M1 设备上通过 Rosetta 2 运行,媒体服务可能存在兼容性瓶颈。可通过设置环境变量优化:
在 electron-builder 配置中添加:
"mac": { "env": { "WEBRTC_STUN_SERVER": "stun:stun.l.google.com:19302" // 显式指定 STUN 服务器,避免设备枚举超时 } }
或在应用启动代码中设置:
process.env.WEBRTC_STUN_SERVER = 'stun:stun.l.google.com:19302';
5. 检查系统权限与资源占用
- 确认应用已获得相机、麦克风权限:前往 macOS 系统设置 -> 隐私与安全性 -> 相机/麦克风,确保对应权限已开启
- 关闭其他正在使用相机的应用,避免资源抢占导致分配失败
内容的提问来源于stack exchange,提问作者Daniel Sapir

