#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
представляет идентификатор другого однорангового узла. Опять же, я зарегистрировал это на консоли, и оно передается без проблем.
Итак, что на самом деле происходит, заключается в следующем:
- Появляется первый игрок, и мир пуст.
- Появляется второй игрок, входящий в мировой экземпляр первого игрока.
- Первый игрок получает второго игрока
p2pAddress
и инициирует вызов с ихaudioStream
помощью. - Второй игрок отвечает на вызов своим
audioStream
.
Журналы консоли в приведенном выше коде запускаются так, как будто они работают, но я ничего не слышу ни на одном клиентском устройстве.
Вещи, которые я пробовал:
- Прикрепление собственного проигрывателя
audioStream
к<audio>
элементу на их собственном устройстве, чтобы убедиться, что поток работает. Я слышал отзывы и звук, так что аудиопоток хороший. - Консоль зарегистрировала входящий поток, и это действительно экземпляр
MediaStream
. - Пробовал и
audio.play()
то, и другое, иaudio.autoplay = true
на<audio>
элементе. - Проверил
<audio> element was being attached to the
` с помощью инспектора. - Протестировал его локально, а также на сервере с.
https://
- Убедился, что разрешения были предоставлены для обоих устройств.
- Убедился, что громкость была увеличена на обоих устройствах.
Любая информация была бы очень признательна.
Ответ №1:
NVM ЭТО РАБОТАЕТ!
Я тестировал старую версию на https://
сервере, когда я нажимал обновления, она работает на удаленном сервере. Я думаю, это просто не работает на localhost.