我已经设法通过一个纯 WebAudio 解决方案(不需要 Recorderjs)来实现这一点。您可以看到它在我的discJS项目中完全运行,并使用相关的源文件来查看我的完整代码是如何运行的。我想这仅与录制您以编程方式播放的 WebAudio 节点有关。
首先,您需要一个 HTML<audio>
来用作最终目的地。在这种情况下,我选择显示控件,以便用户可以轻松下载生成的文件。
<audio id='recording' controls='true'></audio>
现在对于 Javascript mojo:
const CONTEXT = new AudioContext();
var recorder=false;
var recordingstream=false;
function startrecording(){
recordingstream=CONTEXT.createMediaStreamDestination();
recorder=new MediaRecorder(recordingstream.stream);
recorder.start();
}
function stoprecording(){
recorder.addEventListener('dataavailable',function(e){
document.querySelector('#recording').src=URL.createObjectURL(e.data);
recorder=false;
recordingstream=false;
});
recorder.stop();
}
现在最后的粘合是,每当您播放音频源时,您还需要将其连接到您的录制流:
function play(source){
let a=new Audio(source);
let mediasource=CONTEXT.createMediaElementSource(a);
mediasource.connect(CONTEXT.destination);//plays to default context (speakers)
mediasource.connect(recordingstream);//connects also to MediaRecorder
a.play();
}
这是一个相对原始的设置,可以正常工作(在 Firefox 52 和 Chrome 70 上测试)。有关更合适的实现,请参阅MDN 上的 MediaRecorder。