Могу ли я передавать звук микрофона от клиента к клиенту с помощью nodejs?

Я пытаюсь создать голосовой чат в реальном времени. как только клиент держит кнопку и говорит, Я хочу, чтобы звук был отправлен через сокет на бэкэнд nodejs, затем я хочу передать эти данные другому клиенту.

вот код клиента отправителя:

socket.on('connect', function() {
      var session = {
          audio: true,
          video: false
      };

      navigator.getUserMedia(session, function(stream){
          var audioInput = context.createMediaStreamSource(stream);
          var bufferSize = 2048;

          recorder = context.createScriptProcessor(bufferSize, 1, 1);

          recorder.onaudioprocess = onAudio;

          audioInput.connect(recorder);

          recorder.connect(context.destination);

      },function(e){

      });

      function onAudio(e) {

          if(!broadcast) return;

          var mic = e.inputBuffer.getChannelData(0);

          var converted = convertFloat32ToInt16(mic);

          socket.emit('broadcast', converted);
      }

    });

затем сервер получает этот буфер и передает его другому клиенту (в этом примере тому же клиенту)

Код

socket.on('broadcast', function(buffer) {
    socket.emit('broadcast', new Int16Array(buffer));
});

и после этого, для того чтобы сыграть звук на другая сторона (получатель), код клиента, как:

socket.on('broadcast', function(raw) {

      var buffer = convertInt16ToFloat32(raw);

      var src = context.createBufferSource();
      var audioBuffer = context.createBuffer(1, buffer.byteLength, context.sampleRate);

      audioBuffer.getChannelData(0).set(buffer);

      src.buffer = audioBuffer;

      src.connect(context.destination);

      src.start(0);
    });

мой ожидаемый результат заключается в том, что звук от клиента A будет слышен в клиенте B, я могу видеть буфер на сервере, я могу видеть буфер обратно в клиенте, но я ничего не слышу.

Я знаю сокет.Ио 1.x поддерживает двоичные данные, но я не могу найти ни одного примера создания голосового чата, я пытался также использовать BinaryJS, но результаты те же, кроме того, я знаю, что с WebRTC это простая задача, но я не хочу использовать WebRTC, может ли кто-нибудь указать мне хороший ресурс или сказать мне, что мне не хватает?

1 ответов


Я построил что-то подобное самостоятельно несколько недель назад. Проблемы, с которыми я столкнулся (вы в какой-то момент):

  • много данных без уменьшения битрейта и выборки (через интернет)
  • плохое качество звука без интерполяции или лучшего сжатия звука
  • даже если он не показан вам, вы получите разные образцы с разных звуковых карт компьютеров (мой ПК = 48 кГц, мой ноутбук = 32 кГц), что означает, что вы должны написать resampler
  • Websocket-это TCP: каждый аудиопакет достигнет своей цели, но если у вас плохие условия, вы получаете мультиблочные пакеты одновременно или в другом порядке. (U должен использовать прокси-сервер клиента UDP на каждом клиенте, если вы хотите UDP)
  • в WebRTC они уменьшают качество звука, если обнаружено плохое подключение к интернету. Вы не можете этого сделать, потому что это низкоуровневый материал!
  • вы должны реализовать это быстро, потому что JS заблокирует ваш фронтент, если нет > использовать webworkers
  • аудио кодекс в переводе с JS очень медленно, и вы получите неожиданные результаты (см. вопрос audiocodex от меня: здесь) я пробовал Opus также, но пока нет хороших результатов.

Я не работаю над этим проектом на данный момент, но вы можете получить код по адресу:https://github.com/cracker0dks/nodeJsVoip

и рабочий пример: (ссылка удалена) для многопользовательского voip-аудио. (Не работать больше! Websocketserver вниз!) Если вы перейдете в настройки>аудио (на странице), вы можете выбрать более высокий бит и сэмплировать для лучшей аудиоквалльности.

EDIT: можете ли вы сказать мне, почему вы не хотите использовать WebRTC?