Javascript 用于控制音量的AudioWorklet和GainNode

Javascript 用于控制音量的AudioWorklet和GainNode,javascript,web-audio-api,audio-worklet,Javascript,Web Audio Api,Audio Worklet,我正在尝试使用AudioWorket和GainNode进行音量控制,但它不工作,没有AudioWorket,它工作得很好 下面是实现 this.audioContext = new AudioContext({ latencyHint: 'interactive', sampleRate: this.sampleRate, sinkId: audioinput || "default" }); this.audioContext.onstat

我正在尝试使用AudioWorket和GainNode进行音量控制,但它不工作,没有AudioWorket,它工作得很好

下面是实现


this.audioContext = new AudioContext({
      latencyHint: 'interactive',
      sampleRate: this.sampleRate,
      sinkId: audioinput || "default"
    });
    this.audioContext.onstatechange = () => {
      if (this.audioContext) {
        this.state = this.audioContext.state;
      } else {
        this.state = AudioState.CLOSED;
      }
    };
    this.audioBuffer = this.audioContext.createBuffer(1, this.audioSize, this.sampleRate);
    this.audioSource = this.audioContext.createBufferSource();
    this.audioSource.buffer = this.audioBuffer;
    this.audioGain = this.audioContext.createGain();
    this.audioSource.connect(this.audioGain);
    this.audioSource.loop = true;
    this.audioContext.audioWorklet
    .addModule('workers/speaker-worklet-processor.js')
    .then(() => {
      this.speakerWorklet = new AudioWorkletNode(
        this.audioContext,
        'speaker-worklet-processor',
        {
          channelCount: 1,
          processorOptions: {
            bufferSize: 160,
            channelCount: 1,
          },
        },
      );
      this.audioGain.connect(this.speakerWorklet).connect(this.audioContext.destination);
    }).catch((err)=>{
      console.log("Receiver ", err);
    });

下面是我如何设置新音量的

public changeVolume(value: number): void {
  const volume = Number(value) / 100;
  if (this.state !== AudioState.CLOSED) {
    this.audioGain.gain.value = volume;
  }
}


我找到了解决办法,我只是补充说


this.audioGain.connect(this.audioContext.destination);

并直接与worklet节点连接


 this.speakerWorklet.connect(this.audioGain);

这是完整的代码


  this.audioContext = new AudioContext({
      latencyHint: 'interactive',
      sampleRate: this.sampleRate,
      sinkId: audioinput || "default"
    });
    this.audioContext.onstatechange = () => {
      if (this.audioContext) {
        this.state = this.audioContext.state;
      } else {
        this.state = AudioState.CLOSED;
      }
    };
    this.audioBuffer = this.audioContext.createBuffer(1, this.audioSize, this.sampleRate);
    this.audioSource = this.audioContext.createBufferSource();
    this.audioSource.buffer = this.audioBuffer;
    this.audioGain = this.audioContext.createGain();
    this.audioGain.gain.minVal = 0.0;
    this.audioGain.gain.maxVal = 1.0;
    this.audioSource.connect(this.audioGain);
    this.audioSource.loop = true;
    this.audioGain.connect(this.audioContext.destination);
    this.audioContext.audioWorklet
    .addModule('workers/speaker-worklet-processor.js')
    .then(() => {
      this.speakerWorklet = new AudioWorkletNode(
        this.audioContext,
        'speaker-worklet-processor',
        {
          channelCount: 1,
          processorOptions: {
            bufferSize: 160,
            channelCount: 1,
          },
        },
      );
      this.speakerWorklet.connect(this.audioGain);
    }).catch((err)=>{
      console.log("Receiver ", err);
    });


我找到了解决办法,我只是补充说


this.audioGain.connect(this.audioContext.destination);

并直接与worklet节点连接


 this.speakerWorklet.connect(this.audioGain);

这是完整的代码


  this.audioContext = new AudioContext({
      latencyHint: 'interactive',
      sampleRate: this.sampleRate,
      sinkId: audioinput || "default"
    });
    this.audioContext.onstatechange = () => {
      if (this.audioContext) {
        this.state = this.audioContext.state;
      } else {
        this.state = AudioState.CLOSED;
      }
    };
    this.audioBuffer = this.audioContext.createBuffer(1, this.audioSize, this.sampleRate);
    this.audioSource = this.audioContext.createBufferSource();
    this.audioSource.buffer = this.audioBuffer;
    this.audioGain = this.audioContext.createGain();
    this.audioGain.gain.minVal = 0.0;
    this.audioGain.gain.maxVal = 1.0;
    this.audioSource.connect(this.audioGain);
    this.audioSource.loop = true;
    this.audioGain.connect(this.audioContext.destination);
    this.audioContext.audioWorklet
    .addModule('workers/speaker-worklet-processor.js')
    .then(() => {
      this.speakerWorklet = new AudioWorkletNode(
        this.audioContext,
        'speaker-worklet-processor',
        {
          channelCount: 1,
          processorOptions: {
            bufferSize: 160,
            channelCount: 1,
          },
        },
      );
      this.speakerWorklet.connect(this.audioGain);
    }).catch((err)=>{
      console.log("Receiver ", err);
    });