javascript - 录制和保存音频文件变得很奇怪
问题描述
我开始构建一个记录音频并保存它的 Electron 应用程序。我可以录制音频并保存它,然后我也可以播放它。但是当我玩它时,会发生一些奇怪的事情。这是它在 Groovy 播放器上的样子:
而且在 VLC 中,它在左侧和右侧显示相同的时间。
这是我停止录制时的代码
mediaRecorder.addEventListener("stop", async () => {
const audioBlob = new Blob(audioChunks, { type: "audio/wav" });
const buffer = Buffer.from(await audioBlob.arrayBuffer());
const { filePath } = await dialog.showSaveDialog({
buttonLabel: "Save Audio",
defaultPath: `aud-${Date.now()}.wav`,
});
writeFile(filePath, buffer, () =>
console.log("Audio saved successfully")
);
});
我也尝试将其更改为 ogg 但仍然存在同样的问题。提前致谢!
解决方案
我认为错误的原因是音频编解码器之间的不匹配。
您可以使用以下代码轻松重现它。
它录制麦克风音频 2 秒,重新创建具有audio/wav
格式的新 blob 并下载它。它甚至得到435:13:24
了正确的时间。
(async() => {
const microphoneAudioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = audio.captureStream();
const mediaRecorder = new MediaRecorder(microphoneAudioStream);
mediaRecorder.addEventListener('dataavailable', (event) => {
const blob = event.data;
const blobType = "audio/wav";
const extension = "wav";
//const blobType = blob.type;
//const extension = "webm";
const audioBlob = new Blob([blob], { type: blobType });
const anchor = document.createElement("a");
const url = window.URL.createObjectURL(audioBlob);
anchor.href = url;
anchor.download = `test.${extension}`;
anchor.click();
window.URL.revokeObjectURL(url);
});
mediaRecorder.start();
setTimeout(() => {
mediaRecorder.stop();
}, 2000)
})();
就我而言,我试图用audio/webm;codecs=opus
数据创建新的 blob。
有三种解决方案。
- 您可以保持与原始 blob 相同的格式。
- 将另一个参数附加到MediaRecorder 构造函数,其中包含选项对象
mimeType
- 找到一些转换为
audio/webm
的APIaudio/wav
推荐阅读
- css - 具有边框半径和不同边框颜色的多色进度条
- python - AttributeError: 'LogisticRegressionGD' 对象没有属性 'net_input' 为什么我会收到此错误?我定义 net_input
- python - Python 字符串('$' 后跟字符而不是数字)
- java - 申请为方法公共摘要创建查询
- php - Laravel - 如何将图像上传到 Firebase 云存储?
- javascript - mongoose - 删除文档的数组元素,只从数组中选择一个对象
- java - 这是访问、更新和保存 mongoDB 的正确方法吗?
- python - 根据条件添加列以创建top_10
- python - 原生扩展可以支持多个模块吗?
- python - 为什么我只想要一个屏幕时却有两个屏幕?