Node.js及Electron环境下实现阻塞式音频播放直至播放完成的方案问询
问题根源
你之前调用mpg123时进程提前返回,是因为默认开启了交互式控制模式,播放器会启动后台线程执行播放任务,主进程提前退出,导致execSync没有阻塞到播放结束。
可行解决方案
方案1:修改mpg123调用参数,直接用execSync阻塞
给mpg123加上--no-control(禁用交互式控制)和-q(静默输出)参数,强制播放器进程阻塞到播放完成再退出:
const { execSync } = require('child_process'); // 加stdio:ignore避免播放器输出污染日志 execSync('mpg123 -q --no-control ./sample.mp3', { stdio: 'ignore' }); // 执行到这里已经播放完成,直接调用麦克风逻辑即可
注意:同步调用会阻塞当前线程,不要在Electron主进程/渲染进程的主线程调用,避免UI卡住。
方案2:异步监听播放器进程退出事件(更适合Electron场景)
用spawn启动播放器进程,监听exit事件,播放完成后自动触发回调,不会阻塞主线程:
const { spawn } = require('child_process'); const playerProcess = spawn('mpg123', ['-q', '--no-control', './sample.mp3']); playerProcess.on('exit', (exitCode) => { if (exitCode === 0) { // 播放正常结束,此处写入调用麦克风的逻辑 } else { // 播放异常的处理逻辑 } });
方案3:用Electron原生Audio API(无需依赖系统播放器)
不需要安装任何第三方系统播放器,直接用HTML5的Audio API,兼容性更好:
// 渲染进程中直接使用 const audio = new Audio('./sample.mp3'); audio.addEventListener('ended', () => { // 播放完成,调用麦克风逻辑 }); // 触发播放 audio.play().catch(err => { console.error('音频播放失败', err); });
如果需要在主进程触发播放,可以通过IPC通知渲染进程执行上述逻辑即可。
内容的提问来源于stack exchange,提问作者D Liebman
相关产品推荐
相关产品推荐

