преобразование потока чисел в аудио - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь выяснить, как преобразовать (почти в реальном времени) поток чисел в звук.Кажется, что ответ лежит где-то в создании пользовательской волны с использованием функции createOscillator, но я не могу понять, как добавить новые данные в волну и воспроизвести их без или с небольшой задержкой.Моя настройка -

давайте представим систему на основе веб-сокетов, которая отправляет новые данные на мою веб-страницу.(На данный момент я просто использую простой setInterval() для имитации потоковой природы данных.) А сейчас давайте просто предположим, что данные представляют собой строку целых чисел между min и max.

Помощь и указатели приветствуются.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы можете использовать это

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

0 голосов
/ 05 июня 2018

Если поток целых чисел действительно представляет собой данные PCM, вы можете каким-то образом преобразовать их в число с плавающей точкой (на основе значений min и max).Затем создайте AudioBuffer и скопируйте свои данные в AudioBuffer, используя getChannelData() или copyToChannel().Это можно воспроизвести, используя AudioBufferSourceNode.

...