【问题标题】:Web Audio API split mono to stereoWeb Audio API 将单声道拆分为立体声
【发布时间】:2019-03-04 15:09:12
【问题描述】:

假设我有一个连接到目标节点的源节点。 即使音频是单声道的,我也希望能够独立控制每只耳朵的音量,就像我拥有带有分离器和合并节点的立体声音频时一样。

已经尝试在单声道源节点上使用拆分器和合并节点,但是右声道出来是空的。

立体声示例:

var audioCtx = new AudioContext();
var source = audioCtx.createMediaElementSource(myAudio);
var gainNodeL = audioCtx.createGain();
var gainNodeR = audioCtx.createGain();
var splitter = audioCtx.createChannelSplitter(2);
var merger = audioCtx.createChannelMerger(2);

source.connect(splitter);
splitter.connect(gainNodeL, 0);
splitter.connect(gainNodeR, 1);

gainNodeL.connect(merger, 0, 0);
gainNodeR.connect(merger, 0, 1);

merger.connect(audioCtx.createMediaStreamDestination());

当我对单声道音频执行此操作时,右声道会空出来。

【问题讨论】:

标签: javascript web-audio-api


【解决方案1】:

如果信号只是单声道(或者换句话说,它的 channelCount 为 1),则不需要 ChannelSplitterNode。我稍微修改了这个例子。它现在可以拆分振荡器的单声道信号。

var audioCtx = new AudioContext();
var oscillator = audioCtx.createOscillator();
var gainNodeL = audioCtx.createGain();
var gainNodeR = audioCtx.createGain();
var merger = audioCtx.createChannelMerger(2);

oscillator.connect(gainNodeL);
oscillator.connect(gainNodeR);

gainNodeL.connect(merger, 0, 0);
gainNodeR.connect(merger, 0, 1);

merger.connect(audioCtx.destination);

oscillator.start();

function left () {
    gainNodeL.gain.value = 1;
    gainNodeR.gain.value = 0;
}

function right () {
    gainNodeL.gain.value = 0;
    gainNodeR.gain.value = 1;
}

function center () {
    gainNodeL.gain.value = 1;
    gainNodeR.gain.value = 1;
}

【讨论】:

  • 它确实适用于振荡器节点,但源节点无法连接到 2 个节点,它会引发异常
  • 嗨@AlonDayan,你得到哪个错误?在 Firefox 和 Chrome 中用 MediaElementSourceNode 替换振荡器对我有用。理论上,可以将一个节点连接到任意数量的其他节点。
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
相关资源
最近更新 更多