Могу ли я передавать аудио с микрофона с клиента на клиент, используя 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, я вижу буфер на сервере, я могу видеть буфер обратно в клиенте, но ничего не слышу.

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

1 ответ

Решение

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

  • Много данных без снижения битрейта и частоты дискретизации (через Интернет)
  • плохое качество звука без интерполяции или лучшего сжатия звука
  • Даже если он вам не показан, вы получите разные частоты дискретизации от звуковых карт разных компьютеров (мой компьютер = 48 кГц, мой ноутбук = 32 кГц), что означает, что вам нужно написать ресэмплер
  • В WebRTC они уменьшают качество звука при обнаружении плохого интернет-соединения. Вы не можете сделать это, потому что это вещи низкого уровня!
  • Вы должны реализовать это быстро, потому что JS заблокирует ваш интерфейс, если не использует веб-работников
  • Аудиокодек, переведенный на JS, очень медленный, и вы получите неожиданные результаты (см. Один вопрос по аудиокодексу от меня: здесь). Я тоже пробовал Opus, но пока хороших результатов нет.

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

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

РЕДАКТИРОВАТЬ: Можете ли вы сказать мне, почему вы не хотите использовать WebRTC?

Другие вопросы по тегам