Webrtc WebAudio/WaveSurfer:是否录制AudioContext输出?

Webrtc WebAudio/WaveSurfer:是否录制AudioContext输出?,webrtc,audio-recording,web-audio-api,wavesurfer.js,Webrtc,Audio Recording,Web Audio Api,Wavesurfer.js,我使用multiple和region插件在数字仪器中加载样本。就性能而言,它工作得很好,但我试图让用户能够录制他们播放的内容,并将其转换为blob或您拥有的内容。有没有一种方法可以在单个音频环境中录制和保存实时播放的声音?到目前为止,我只能够捕捉到麦克风的外部输入,这是非常整洁的 我曾考虑使用WaveSurfer的MediaElement fallback和captureStream()API,但不幸的是,MediaElement似乎抛出了一个错误,表示它无法查询undefined的选择器 下面

我使用multiple和region插件在数字仪器中加载样本。就性能而言,它工作得很好,但我试图让用户能够录制他们播放的内容,并将其转换为blob或您拥有的内容。有没有一种方法可以在单个音频环境中录制和保存实时播放的声音?到目前为止,我只能够捕捉到麦克风的外部输入,这是非常整洁的

我曾考虑使用WaveSurfer的MediaElement fallback和captureStream()API,但不幸的是,MediaElement似乎抛出了一个错误,表示它无法查询undefined的选择器

下面是初始化每个WaveSurfer的代码:

this.wavesurfer = WaveSurfer.create({
    container: this.wave_id,
    waveColor: 'black',
    progressColor: 'purple',
    pixelRatio: 1,
    plugins: [
      RegionPlugin.create()
  ]
  });
非常感谢

更新: 我只能通过创建缓冲源,将其连接到AudioContext目标,并将其连接到MediaStreamDestination来录制。但我只能对每个单独的WaveSurfer执行此操作,当我尝试为WaveSurfer所锁定的全局音频上下文创建缓冲区时,它不会将声音返回到流中。如果有任何记录所有全局上下文输出的指针,我将不胜感激

以下记录单个WaveSurfer输出:

//buffer source node passed to media stream from a single wavesurfer instance. instantiated in wavesurfer.jsx component
          this.bufferSource = this.wavesurfer.backend.ac.createBufferSource();
          this.bufferSource.buffer = this.wavesurfer.backend.buffer;
          this.bufferSource.connect(this.wavesurfer.backend.ac.destination);




//method called which records the output and loads a blob into a new 
//wavesurfer (created elsewhere on event emission)

        recordContext(context, source){

        const dest = context.createMediaStreamDestination();
        const mediaRecorder = new MediaRecorder(dest.stream);
        source.connect(dest)

        mediaRecorder.start();
        source.start()

         setTimeout(() => {
        mediaRecorder.stop();
        source.stop()
         }, 5000)


        mediaRecorder.ondataavailable = (evt) => {
         // push each chunk (blobs) in an array
         console.log('you have data')
         this.state.chunks.push(evt.data);
        };

        mediaRecorder.onstop = (evt) => {
         // Make blob and open it.
         let blob = new Blob(this.state.chunks, { 'type' : 'audio/ogg; codecs=opus' });
             console.log(blob) 
             let audioURL = window.URL.createObjectURL(blob);
        };

     }
更新2:


我现在已经朝着正确的方向迈出了一步,将每个缓冲区合并成一个缓冲区,并将其传递到AudioContext中,但是缺少实时元素,因为这只是连接静态缓冲区。当用户触发样本区域时,是否有方法从每个缓冲区实时捕获PCM流

查看您的api。。找到一种获取音频缓冲区的方法--公开诸如byteArray或arrayBuffer之类的内容。。。确定缓冲区中的字节是编码的还是原始的。。。如果你做到了这一点,那么你可以复制缓冲区,在克隆上做任何事情。。。对其进行编码、toBlob、append数组等。谢谢Robert,我想知道要访问哪个特定属性,但对MDNs文档没有意义。我会尝试一下,然后再回复你。我会更新:我可以通过创建缓冲源,将其连接到AudioContext目的地,并将其连接到MediaStreamDestination来录制,但我只能为每个单独的WaveSurfer这样做。当我尝试为WaveSurfer所锁定的全局音频上下文创建缓冲区时,它不会将声音返回到流中。如果有任何指针记录所有全局上下文输出,我将不胜感激。重用现有上下文是可能的,但正如本线程结尾所示,在ios上,这可能是一件棘手的事情。。你可能会发现ez可以构建和使用新的音频上下文,而不是重用现有的。我现在已经朝着正确的方向迈出了一步,将每个缓冲区合并成一个缓冲区,并将其传递到AudioContext中,但是缺少实时元素,因为这只是连接静态缓冲区。当用户触发样本区域时,是否有方法从每个缓冲区实时捕获PCM流?