Могу ли я передавать звук с микрофона от клиента к клиенту с помощью 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);
    });

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

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


person udidu    schedule 20.06.2015    source источник


Ответы (1)


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

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

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

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

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

person Cracker0dks    schedule 21.06.2015
comment
Большое спасибо за этот информативный ответ. Причина, по которой я не хочу использовать webrtc: во-первых, я должен использовать службы STUN и TURN, чтобы заставить его работать в Интернете, а во-вторых, скажем, вы хотите, чтобы один клиент транслировался 10 пользователям, это означает 10 одноранговых соединений, тем больше клиентов в чате, тем больше одноранговых соединений необходимо установить каждому клиенту - person udidu; 21.06.2015
comment
да, вам нужны серверы STUN и TURN, но вы найдете множество серверов, которые вы можете использовать или разместить самостоятельно (code.google.com/p/rfc5766-turn-server). Для решения проблемы many2many вы можете поискать программное обеспечение под названием: MCU. Лучшим MCU для WebRTC (с открытым исходным кодом) на данный момент является Licode: lynckia.com/licode я думаю( и используя) , но вы также можете взглянуть на: kurento.org и Telepresence: code.google.com/p/телеприсутствие - person Cracker0dks; 21.06.2015
comment
TCP следит за тем, чтобы все пакеты поступали в правильном порядке. - person phyyyl; 15.10.2018