Electron开发:如何将audio/wav类型Blob转换为WAV文件?
解决方案:在Electron主进程中将音频Blob保存为WAV文件
你需要结合Node.js的文件系统模块完成写入操作,核心是把浏览器的ArrayBuffer转换为Node.js识别的Buffer类型,再写入指定目录。
完善主进程代码
直接修改你的ipcMain监听逻辑,加入文件保存流程:
const { ipcMain } = require('electron'); const fs = require('fs').promises; // 使用Promise版fs适配async/await const path = require('path'); const { Buffer } = require('buffer'); // Node内置模块,无需额外安装 ipcMain.on('save-audio', async (event, arrayBuffer) => { try { // 1. 把浏览器的ArrayBuffer转成Node.js的Buffer const audioBuffer = Buffer.from(arrayBuffer); // 2. 获取main.js所在的目录路径 const mainScriptDir = path.dirname(require.main.filename); // 3. 生成唯一文件名(用时间戳避免覆盖旧文件) const saveFileName = `audio-recording-${Date.now()}.wav`; const fullSavePath = path.join(mainScriptDir, saveFileName); // 4. 写入文件到目标目录 await fs.writeFile(fullSavePath, audioBuffer); console.log(`音频已成功保存:${fullSavePath}`); // 可选:向渲染进程发送保存成功的通知 event.reply('save-audio-success', fullSavePath); } catch (error) { console.error('音频保存失败:', error); // 可选:向渲染进程发送错误信息 event.reply('save-audio-fail', error.message); } });
关键注意点
- 格式兼容性:部分浏览器的
MediaRecorder默认不输出audio/wav(比如Chrome默认输出audio/webm),如果保存的文件无法播放,可在渲染进程打印mediaRecorder.mimeType确认实际格式,再同步调整Blob的type和文件后缀。 - 权限问题:确保Electron应用拥有目标目录的写入权限,打包后的应用尤其需要注意。
- 文件名唯一性:用时间戳或随机字符串命名,避免重复录制时覆盖已有文件。
可选:渲染进程接收保存状态
如果需要在前端反馈保存结果,可在preload脚本中暴露监听方法,再在渲染进程中接收:
preload.js补充代码
const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('audioAPI', { sendAudioToMain: (buffer) => ipcRenderer.send('save-audio', buffer), onSaveSuccess: (callback) => ipcRenderer.on('save-audio-success', (event, path) => callback(path)), onSaveFail: (callback) => ipcRenderer.on('save-audio-fail', (event, msg) => callback(msg)) });
渲染进程监听代码
// 在录制完成后监听结果 window.audioAPI.onSaveSuccess((savePath) => { alert(`音频已保存至:${savePath}`); }); window.audioAPI.onSaveFail((errorMsg) => { alert(`保存失败:${errorMsg}`); });
内容的提问来源于stack exchange,提问作者originofpork
相关产品推荐
相关产品推荐

