Electron主进程播放音频技术问询:WebSocket消息触发本地音频播放
在Electron主进程中播放本地音频的解决方案
当然可以在Electron主进程里播放本地音频文件啦——像你这种没法依赖渲染器进程的场景,这是很常见的解决方案。下面给你两种靠谱的实现方式:
方案一:使用第三方库(简单跨平台)
最省心的方式是用play-sound这个npm包,它已经帮你处理了跨平台的兼容性问题,支持Windows、macOS和Linux。
步骤:
- 安装依赖:
npm install play-sound --save
- 在主进程中调用播放:
const path = require('path'); const player = require('play-sound')(opts = {}); // 假设你的音频文件在项目根目录的assets文件夹下 const soundPath = path.join(__dirname, '../assets/notification.wav'); // 在WebSocket收到消息时调用播放 webSocket.on('message', (data) => { player.play(soundPath, (err) => { if (err) console.error('播放提示音失败:', err); }); });
这个库会自动调用系统对应的音频播放器,不需要你自己处理平台差异。
方案二:直接调用系统原生播放器(无额外依赖)
如果你不想引入第三方包,也可以用Node.js的child_process模块直接调用系统自带的音频播放命令,完全零依赖。
代码示例:
const { exec } = require('child_process'); const path = require('path'); const os = require('os'); const playNotificationSound = () => { const soundPath = path.join(__dirname, '../assets/notification.wav'); let command; switch(os.platform()) { case 'darwin': // macOS command = `afplay "${soundPath}"`; break; case 'win32': // Windows command = `powershell -c (New-Object Media.SoundPlayer '${soundPath}').PlaySync()`; break; case 'linux': // Linux command = `aplay "${soundPath}"`; break; default: console.error('当前平台不支持原生音频播放'); return; } exec(command, (err) => { if (err) console.error('播放提示音失败:', err); }); }; // WebSocket消息触发播放 webSocket.on('message', (data) => { playNotificationSound(); });
关键注意事项
- 路径正确性:一定要用
path.join拼接绝对路径,因为主进程的工作目录在开发和打包后可能不一致,直接用相对路径容易找不到文件。 - 打包资源配置:如果用Electron Builder或Electron Packager打包应用,要确保音频文件被包含在打包产物里。比如在
package.json的files字段中添加:"files": [ "assets/**/*", "main.js" ] - 错误处理:记得捕获播放过程中的错误,避免因为音频文件损坏或路径错误导致主进程崩溃。
内容的提问来源于stack exchange,提问作者MadMaxAPP
相关产品推荐
相关产品推荐

