2016-05-29 1 views
5

Я пытаюсь реализовать ScriptProcessorNode с двумя входными и одним выходным каналами.Как подключить два входных канала к ScriptProcessorNode? (Web Audio Api, JavaScript)

var source = new Array(2); 

source[0] = context.createBufferSource(); 
source[0].buffer = buffer[0]; 

source[1] = context.createBufferSource(); 
source[1].buffer = buffer[1]; 

var test = context.createScriptProcessor(4096, 2, 1); 

source[0].connect(test, 0, 0); 
source[1].connect(test, 0, 1); 

test.connect(context.destination); 

source[0].start(); 
source[1].start(); 

Когда я запускаю этот код в Google Chrome, а также в Mozilla Firefox, я получаю следующую ошибку. Это говорит мне, что мой узел test имеет только один входной канал.

Uncaught IndexSizeError: Failed to execute 'connect' on 'AudioNode': input index (1) exceeds number of inputs (1). 

Когда я утешаю печатать число входных каналов ScriptProcessorNode test я получаю два входных канала.

test.onaudioprocess = function(evt){ 
    console.log("number of input channels: " + evt.inputBuffer.numberOfChannels); 
} 

Тем не менее, соединяющая два узла к входу test узла не работает так, как я это делаю. Я хочу запрограммировать вокодер внутри ScriptProcessorNode. Как я могу создать ScriptProcessorNode с двумя входными и одним выходными каналами и подключить два источника в качестве входного канала и context.destination в качестве выходного канала?

+0

https://developer.mozilla.org/en-US/docs/Web/API/ChannelMergerNode Вы считали это? –

+0

Мне нужны оба входных канала в функции, которая запускается onaudioprocess, чтобы связать их определенным образом вместе. Я мог бы создать два ScriptProcessorNodes и объединить их позже, но я не знаю, как запускать два ScriptProcessorNodes параллельно. – thiloilg

+0

Я понимаю, что вы хотите, чтобы оба канала обрабатывались отдельно? В этом случае вы, вероятно, хотите https://developer.mozilla.org/en-US/docs/Web/API/ChannelSplitterNode и два разных сценария ScriptProcessorNode для обработки каждого монопотока. –

ответ

5

Второй параметр createScriptProcessor - это количество входных каналов на один вход узла, а не количество входов в узел.

Таким образом, для этого необходимо использовать ChannelMergerNode с двумя входами. Подключите два источника к каждому входу узла объединения. Результат слияния должен быть подключен к вашему узлу процессора скриптов. Обратный вызов onaudioprocess будет присвоен AudioBuffer, который имеет в нем два канала. Затем вы можете обрабатывать эти два канала, как хотите.

+0

Одна вещь, которая, по моему мнению, немного ужасающая о '.connect (_, _, inputIndex)', заключается в том, что, если я ее правильно понимаю, inputIndex может ** ** использоваться ** вместе с конкретным «ChannelMergerNode». Все остальные типы узлов имеют один или нулевой вход. ChannelMergerNode - единственный тип узла, который имеет более 1 вход. –

+0

Да, это правда. Но 'AudioWorklets' может иметь более одного входа. –

Смежные вопросы