0

我在我的项目中使用网络音频 api。有没有办法记录发送到 webkitAudioContext.destination 的音频数据?.wav 文件正在我的浏览器中播放,因此应该有某种方法可以将该数据存储到 (.wav) 文件中。我知道这是可能的,但还没有找到任何解决方案:(recorder.js 可以帮助我,但到目前为止我发现它只是录制麦克风实时输入,是否可以在帮助下录制我的音频(.wav 文件) recorder.js 的?请帮助

我正在使用此示例进行录制https://github.com/mattdiamond/Recorderjs

4

2 回答 2

4

我已经设法通过一个纯 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

于 2018-10-30T17:19:59.053 回答
1

如在 github: 上找到的var rec = new Recorder(source [, config]),其中 source 是一个音频节点。因此,由您决定是否放入正确的节点。如果您.wav使用 播放文件<audio>,则可以将其发送到录音机:

<audio id="audio" src="" controls></audio>

var a = document.getElementById('audio');
var context = new webkitAudioContext();
var sourceNode = context.createMediaElementSource(a);
var rec = new Recorder(sourceNode);
于 2014-01-31T23:10:48.567 回答