Нет звука с peerjs (без ошибок)?

#javascript #audio #webrtc #peerjs

#javascript #Аудио #webrtc #peerjs

Вопрос:

Я пытаюсь добавить аудиочат в игру, используя WebRTC через PeerJS. Я успешно генерирую уникальный идентификатор для обоих одноранговых узлов, а затем передаю их через сокет.сервер ввода-вывода и установление вызова. Как только у каждого клиента есть аудиопоток друг друга, я прикрепляю это к новому <audio> тегу и добавляю его к телу. Но после установления соединения звук не слышен.

Мой код выглядит следующим образом:

Создание одноранговых узлов, уникальных идентификаторов:

 import Peer from 'peerjs';
import getUserMedia from 'getusermedia';

// ...

getUserMedia({ audio: true, video: false }, (err, stream) => {
  if (err) return console.error(err);

  console.log('Got audio stream!');

  this.peer = new Peer();
  
  this.peer.on('open', (id) => {
    this.p2pAddress = id;
    this.audioStream = stream;
    joinBtn.setInteractive();
    joinBtn.setAlpha(1);
  });
});
 

Обратите внимание, что это все в игре Phaser 3, поэтому я присваиваю p2pAddress и audioStream текущей сцене, а затем передаю их в последующую сцену, когда пользователь нажимает кнопку присоединиться (хотя я зарегистрировал их в консоли в следующей сцене, и они действительно передаются).

Прослушивание входящих вызовов:

 // Audio chat
this.peer.on('call', (call) => {
  call.answer(this.audioStream);
  console.log('Answered incoming call');

  call.on('stream', (remoteStream) => {
    console.log('Got stream', remoteStream);
    const audio = document.createElement('audio');
    audio.style.display = "none";
    document.body.appendChild(audio);

    audio.srcObject = remoteStream;
    audio.play();
  });
});
 

Инициирование аудиопотока:

 // Initate audio stream
const call = this.peer.call(player.p2pAddress, this.audioStream);
console.log('Calling', player.p2pAddress);
console.log(this.audioStream);

call.on('stream', (remoteStream) => {
  const audio = document.createElement('audio');
  audio.style.display = "none";
  document.body.appendChild(audio);

  audio.srcObject = remoteStream;
  audio.play();
});
 

В этом случае player.p2pAddress представляет идентификатор другого однорангового узла. Опять же, я зарегистрировал это на консоли, и оно передается без проблем.

Итак, что на самом деле происходит, заключается в следующем:

  1. Появляется первый игрок, и мир пуст.
  2. Появляется второй игрок, входящий в мировой экземпляр первого игрока.
  3. Первый игрок получает второго игрока p2pAddress и инициирует вызов с их audioStream помощью.
  4. Второй игрок отвечает на вызов своим audioStream .

Журналы консоли в приведенном выше коде запускаются так, как будто они работают, но я ничего не слышу ни на одном клиентском устройстве.

Вещи, которые я пробовал:

  • Прикрепление собственного проигрывателя audioStream к <audio> элементу на их собственном устройстве, чтобы убедиться, что поток работает. Я слышал отзывы и звук, так что аудиопоток хороший.
  • Консоль зарегистрировала входящий поток, и это действительно экземпляр MediaStream .
  • Пробовал и audio.play() то, и другое, и audio.autoplay = true на <audio> элементе.
  • Проверил <audio> element was being attached to the ` с помощью инспектора.
  • Протестировал его локально, а также на сервере с. https://
  • Убедился, что разрешения были предоставлены для обоих устройств.
  • Убедился, что громкость была увеличена на обоих устройствах.

Любая информация была бы очень признательна.

Ответ №1:

NVM ЭТО РАБОТАЕТ!

Я тестировал старую версию на https:// сервере, когда я нажимал обновления, она работает на удаленном сервере. Я думаю, это просто не работает на localhost.