MacOS下Electron desktopCapturer捕获系统音频无第三方工具方案问询
macOS下Electron无额外第三方工具采集系统音频实现方案
可以实现,无需让用户安装Soundflower这类第三方工具,也可以自行开发对应能力集成到你的Electron应用中,具体逻辑如下:
基础前提
Electron官方文档提到的需要签名内核扩展的限制是旧版本macOS的遗留要求,从macOS 10.15 Catalina开始,系统开放了用户态的CoreAudio API用于系统音频采集,不需要内核扩展即可实现,Chromium内置的navigator.mediaDevices.getUserMedia没有对接这部分系统能力,才导致原生API不支持,不是系统层面的强制限制。
Discord的实现逻辑
Discord的Electron客户端的系统音频采集能力完全是自研的原生扩展实现,没有依赖公开第三方工具:
- 核心采集逻辑用Objective-C基于CoreAudio框架开发,封装为Node.js原生扩展内置到应用包中
- 主进程调用扩展接口拉取系统输出设备的音频流,只需要用户给应用开启「音频录制」系统权限即可运行
- 采集到的PCM音频流通过Electron IPC传递到渲染层,或者直接在原生层完成混音、推流等操作
自行开发集成的步骤
你可以自行开发对应能力,不需要对外依赖任何第三方工具:
- 用
node-addon-api开发Node.js原生扩展,基于CoreAudio框架实现系统音频采集:核心调用
AudioObjectGetPropertyData枚举系统默认输出设备,通过AudioQueue或者AVCaptureSession的音频输出端口挂载tap回调,拉取系统输出的原始PCM音频数据 - 适配你使用的Electron版本的ABI,将扩展打包到你的应用依赖中
- 在Electron主进程调用扩展的采集接口,获取到的音频流可以直接在原生层处理,也可以转成Web Audio支持的格式传递给渲染层使用,还可以通过
MediaStreamTrackGenerator注入到媒体流中,和getUserMedia获取的摄像头/麦克风流合并使用
打包注意事项
- 应用的
Info.plist中需要添加NSMicrophoneUsageDescription权限声明,说明采集音频的用途 - 如果发布到Mac App Store,需要开启沙箱的音频录制权限
- 整个逻辑完全内置在应用包中,不需要用户额外安装任何工具
内容的提问来源于stack exchange,提问作者mathlete
相关产品推荐
相关产品推荐

