Я пытаюсь настроить систему потоковой передачи звука в реальном времени, в которой клиент будет транслировать звук со своего микрофона (доступ к которому осуществляется с помощью getUserMedia) одному или нескольким одноранговым узлам. Для этого фрагменты аудиопотока отправляются через WebSocket на сервер, который затем передает эту информацию всем одноранговым узлам, подключенным к WebSocket.
Моя основная проблема связана с тем, как воспроизводить фрагменты данных, полученных одноранговыми узлами на веб-сайте.
Во-первых, вот как я отправляю фрагменты аудиоданных на свой клиент, транслирующий JS-скрипт:
var context = new AudioContext();
var audioStream = context.createMediaStreamSource(stream);
// Create a processor node of buffer size, with one input channel, and one output channel
var node = context.createScriptProcessor(2048, 1, 1);
// listen to the audio data, and record into the buffer
node.onaudioprocess = function(e){
var inputData = e.inputBuffer.getChannelData(0);
ws.send(JSON.stringify({sound: _arrayBufferToBase64(convertoFloat32ToInt16(inputData))}));
}
audioStream.connect(node);
node.connect(context.destination);
arrayBufferToBase64 и convertoFloat32ToInt16 — это методы, которые я использую для отправки соответственно потока в формате base64 и для преобразования inputData в Int16 вместо этого причудливого представления Float32 (я использовал методы, найденные в SO, которые должны были работать).
Затем, после того как данные прошли через WebSocket, я собираю данные в другом скрипте, который будет выполняться на сайте каждого пира:
var audioCtx = new AudioContext();
var arrayBuffer = _base64ToArrayBuffer(mediaJSON.sound);
audioCtx.decodeAudioData(arrayBuffer, function(buffer) {
playSound(buffer);
});
Мне также нужно преобразовать полученные данные base64 в ArrayBuffer, которые затем будут декодированы с помощью decodedAudioData для создания audioBuffer типа AudioBuffer. Функция playSound проста:
function playSound(arrBuff) {
var src = audioCtx.createBufferSource();
src.buffer = arrBuff;
src.looping = false;
src.connect(audioCtx.destination);
src.start();
}
Но по некоторым причинам я не могу воспроизвести звук в этом сценарии. Я почти уверен, что сценарий вещания правильный, но не сценарий «слушателя». Может ли кто-нибудь помочь мне в этом?
Спасибо !