Вы можете использовать это
mynode = audio_context.createScriptProcessor(BUFF_SIZE, num_channels, num_channels);
или более, просто заполнив буфер точками данных PCM согласно
var node = context.createBufferSource()
, buffer = context.createBuffer(1, 4096, context.sampleRate)
, data = buffer.getChannelData(0);
for (var i = 0; i < 4096; i++) { // you replace this with logic to feed your PCM data
data[i] = Math.random();
}
node.buffer = buffer;
node.loop = true;
node.connect(context.destination);
node.start(0);
хитрый бит, чтобы убедиться, что вы платите дань уваженияЦикл событий API-интерфейса Web Audio, который никогда не должен изнуряться или каким-либо образом игнорироваться слишком долго, иначе вы услышите всплывающие и другие звуковые сигналы, которые вы проигнорировали время его подачи ... Я предлагаю размер буфера, как указано выше ... слишком большой, и вы вводитезаметная задержка между подачей и воспроизведением ... слишком короткая, и вы, возможно, создали слишком горячий цикл между производством аудиоданных и их потреблением ... в качестве учебного упражнения я написал https://github.com/scottstensland/websockets-streaming-audio, которыйпотоковая передача аудио с сервера nodejs в браузер с использованием веб-сокетов, которые затем преобразуются в аудио с использованием API Web Audio ... это может дать вам несколько советов
Похоже, что текущее заклинание заключается в использовании audioworker, который выполняется обратным вызовомкогда цикл событий Web Audio API хочет получить питание ... https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API#Audio_Workers ... однако дочто бы запекаться во всех браузерах, я советую вам все еще использовать https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode ... обратить особое внимание на обратный вызов onaudioprocess