【发布时间】:2021-01-01 14:51:58
【问题描述】:
(请参阅https://github.com/norbjd/wavesurfer-upload-and-record 以获取最小的可重现示例)。
我正在使用wavesurfer.js 将用户上传的音频显示为波形,我正在尝试添加一个功能来录制上传的部分音频。
所以我创建了一个“录制”按钮(现在只录制 5 秒的音频),点击它时使用以下代码。我正在使用MediaRecorder API:
document
.querySelector('[data-action="record"]')
.addEventListener('click', () => {
// re-use audio context from wavesurfer instead of creating a new one
const audioCtx = wavesurfer.backend.getAudioContext();
const dest = audioCtx.createMediaStreamDestination();
const audioStream = dest.stream;
audioCtx.createMediaElementSource(audio).connect(dest);
const chunks = [];
const rec = new MediaRecorder(audioStream);
rec.ondataavailable = (e) => {
chunks.push(e.data);
}
rec.onstop = () => {
const blob = new Blob(chunks, { type: "audio/ogg" });
const a = document.createElement("a");
a.download = "export.ogg";
a.href = URL.createObjectURL(blob);
a.textContent = "export the audio";
a.click();
window.URL.revokeObjectURL(a.href);
}
wavesurfer.play();
rec.start();
setTimeout(() => {
rec.stop();
wavesurfer.stop();
}, 5 * 1000);
});
单击录制按钮时,wavesurfer 应该会播放 (wavesurfer.play()),但我在浏览器中听不到任何声音(但我可以看到光标移动)。在录制结束时(5 秒,用setTimeout 设置),我可以下载录制的音频(rec.onstop 功能),并且声音可以在 VLC 或任何其他媒体播放器中正确播放。
但是,我无法再通过浏览器在网页上播放音频。我仍然可以录制音频,并且可以正确下载和播放录制的音频。
我想知道为什么在第一次单击“录制”按钮后,音频不会在浏览器上播放。我认为这条线:
audioCtx.createMediaElementSource(audio).connect(dest);
是问题,但没有它,我无法录制音频。
我还尝试重新创建一个新的AudioContext,而不是使用 wavesurfer 的:
const audioCtx = new AudioContext();
但效果不好(同样的问题)。
我已经在一个最小的可重现示例中重现了该问题:https://github.com/norbjd/wavesurfer-upload-and-record,因此请随时检查。欢迎任何帮助!
【问题讨论】:
标签: javascript audio mediastream wavesurfer.js