首页 > 解决方案 > 我可以在它到达另一个应用程序之前在本地捕获和编辑音频流吗?

问题描述

下午好!在这个实现中,我将电子和 javascript 与 webRTC 一起使用。

为了详细说明这个问题,我了解从 StreamHandler 获取流并调用 mediaDevices.getUserMedia 之前我在做什么。获得该流后,我已成功添加 AudioContext 以创建过滤器、调整增益等。我听说这些更改也发生在 audioDestination 设备上。所以到目前为止一切都很好。所以我现在的问题是我如何将编辑后的音频流放回它可能去的地方?一个具体的例子是,假设我捕获了主麦克风的流,并且我想在音频使其不和谐、抽搐等之前调整增益。

如果我想象我认为的过程

Mic Input ---> Grab Stream ---> Edit Stream ---> Continue output to 3rd party app。

但似乎发生的是流创建了一个单独的通道,并且只会在我自己的输出设备上播放,因为我没有目的地可以从指向我的音频已经指向的位置的设备中进行选择。请理解我仍在弄清楚这一切是如何运作的。我也很乐意更改或编辑问题以更好地满足标准,请告诉我。

更新:我正在添加我的代码的构造函数和 updateStream 函数。构造函数是我从本地机器获取媒体流的地方,当单击按钮以激活音频更改并将其播放到输出时,将调用更新流。我卡住的地方是,当我通过耳机或扬声器播放更新时会发出声音,但我不知道如何让流返回并通过上面提到的应用程序播放。

  constructor(navigator, deskCap, constraints) {
    this._navigator = navigator;
    this._constraints = constraints;
    this._desktopCapturer = deskCap;
    this._mainStream = new MediaStream();

    // Call our object setup functions
    this.getAudioSources();
    navigator.mediaDevices.getUserMedia(constraints).then((media) => {
      
      this._mainStream = media;
      });

    }); 
  }

  updateStream = () => {
    let stream = this._mainStream;
    
    const audContext = new AudioContext(); // Electron AudioContext

    const source = audContext.createMediaStreamSource(stream);
    const audDest = audContext.createMediaStreamDestination();
    const audSource = audContext.createMediaStreamSource(stream);
    
    const gainNode = audContext.createGain();
    let x = parseFloat(this._outputVolume);

    if(!isNaN(x)) {
      gainNode.gain.value = x;
    } else {
      gainNode.gain.volume = 0.33;
    }
    gainNode.connect(audDest);

    this._mainStream = audDest.stream;
}

标签: javascriptwebrtcmediastreammediastreamtrack

解决方案


推荐阅读