如何与Web Audio API并行处理

时间:2015-08-01 21:32:19

标签: javascript api audio html5-audio web-audio

所以我一直在尝试通过不同的源在同一个文件上创建并行处理效果。声音工程中的并行处理基本上是当您复制信号两次并对每个信号应用不同的效果时(例如,如果我希望延迟仅在较低端工作,那么我将复制信号并添加一个较低的biQuad然后仅对该信号进行增强+回声,而不是原始信号。

现在我通过不同的音频变量确定了相同的文件

var mainVerse = document.getElementById('audio1');
var mainVerseParallel = document.getElementById('audio2');

其中audio1和audio2指向同一个源。我还为每个文件提供了两个来源

var source = audioCtx.createMediaElementSource(mainVerse);
var source2 = audioCtx.createMediaElementSource(mainVerseParallel); 

然后我将过滤器应用于每个节点

var s = source;
var s2 = source2;

 source.disconnect(audioCtx.destination);
source2.disconnect(audioCtx.destination);

for (var i in filters1) {
 s.connect(filters1[i]);
 s = filters1[i];
}


for (var i in filters2) {
 s2.connect(filters2[i]);
 s2 = filters2[i];
}

s.connect(audioCtx.destination);
s2.connect(audioCtx.destination);

但是当我播放音频文件的时候:

mainVerseParallel.play();
mainVerse.play();

他们没有正确同步,我已经尝试过了;

audio.addEventListener("canplaythrough", function, false)

但每次重新开始播放时都会发出不同的声音。有没有办法解决这个同步问题,还是有办法我可以做并行处理效果,我不需要创建两个音频变量和两个源?

1 个答案:

答案 0 :(得分:1)

您不需要两个独立的信号源来分割信号路径。

var s = source;
var s2 = source;
//       ^^^^^^ NOTE: not using source2

for (var i in filters1) {
    s.connect(filters1[i]);
    s = filters1[i];
}

for (var i in filters2) {
    s2.connect(filters2[i]);
    s2 = filters2[i];
}

s.connect(audioCtx.destination);
s2.connect(audioCtx.destination);