45 lines
1.2 KiB
JavaScript

const fs = require("fs");
/**
* 录制音频
* @param {number} duration 录制时长(ms)
* @param {string} savePath 保存路径
*/
async function record(duration = 5000, savePath) {
const format = "audio/webm";
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const mediaRecorder = new MediaRecorder(stream, { mimeType: format });
const chunks = [];
return new Promise((resolve, reject) => {
mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
mediaRecorder.onstop = async () => {
try {
const blob = new Blob(chunks, { type: format });
if (savePath) {
// 使用 FileReader 读取 blob 数据
const reader = new FileReader();
reader.onload = () => {
const buffer = Buffer.from(reader.result);
fs.writeFileSync(savePath, buffer);
};
reader.readAsArrayBuffer(blob);
}
stream.getTracks().forEach((track) => track.stop());
resolve(blob);
} catch (error) {
reject(error);
}
};
mediaRecorder.onerror = reject;
mediaRecorder.start();
setTimeout(() => mediaRecorder.stop(), duration);
});
}
module.exports = {
record,
};