Peer.on ('calll') никогда не вызывается

Peer js не работает

Я просто создаю приложение для потоковой передачи видео peerjs в NodeJs и ReactJs


Приведенный ниже код работает нормально, я могу создать новый одноранговый узел, и событие open также работает.

const peer = new Peer(undefined,{
            host:"/",
            port:"5001"
        });

peer.on('open',id=>{
  socket.emit('join-room', roomId,id);
})

На стороне сервера всякий раз, когда генерируется событие 'join-room', сервер генерирует другое событие 'user-disconnected' и передает userId (peerjs) клиенту.

// server.js
socket.on('join-room',(roomId,userId)=>{
    console.info(`user ${userId} joined ${roomId}`);
    socket.join(roomId);
    socket.to(roomId).emit('user-connected',userId);

    socket.on('disconnect', () => {
        socket.to(roomId).emit('user-disconnected', userId)
    })
})

Всякий раз, когда 'user-connected' запускается на стороне клиента, я звоню connectToNewUser, и до этого все работает нормально.

socket.on('user-connected',userId=>{
    console.info("New user connected...")
    connectToNewUser(userId, stream)
});

Ошибка

Это регистрируется на консоли console.info('connectToNewUser',1222.....), ошибки нет.

Но этот call.on('stream') никогда не называют

connectToNewUser(userId, stream) {
    console.info('connectToNewUser',userId)
    const call = peer.call(userId, stream);
    const video = getVideo();
    call.on('stream', userVideoStream => {
      // never called
      console.info('connectToNewUser','on','stream')
      addVideoStream(video, userVideoStream)
    });
    call.on('close', () => {
      video.remove()
    })

    peers[userId] = call
}

Причина того, что call.on('stream') никогда не вызывается, заключается в том, что peer.on('call') никогда не вызывается.

peer.on('call', call => {
    // never called
    console.info('This peer is being called...');
    call.answer(stream)
    const video = getVideo();
    call.on('stream', userVideoStream => {
        console.info('This peer is being called...on-stream...');
        addVideoStream(video, userVideoStream)
    })
});

Репозиторий Github

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
47
1

Ответы 1

Ваш код похож на проект, над которым я работаю. У меня возникли проблемы с тем, где я запускал экземпляр peer. Мне пришлось переместить его на один уровень вверх в моем дереве компонентов, потому что что-то, что я делал, вызывало повторный рендеринг, и экземпляр peer создавался заново с новым id.

Также проверьте, где вы создаете свою розетку. Убедитесь, что ваше событие user-connected регистрируется в useEffect().

  useEffect(() => {
    videoSocket = initiateVideoSocket(roomId, username, peer.id);
    // When a viewer connects, this event is emitted and the streamer will connect to the viewer.
    videoSocket.on("user-connected", (roomId, viewerPeerId) => {
      connectToNewViewer(viewerPeerId, videoStream);
    });
  }, [videoStream]);
  const viewerVideoSocket = initiateVideoSocket(
    room,
    props.username,
    viewerPeerId
  );

  const viewerChatSocket = initiateChatSocket(room, props.username);
  let streamerVideoDiv;

  useEffect(() => {
    viewerVideoSocket.emit(
      "user-connected",
      room,
      props.username,
      viewerPeerId
    );

    viewerPeer.on("call", (call) => {
      call.answer();
      call.on("stream", (stream) => {
        streamerVideoDiv = document.getElementById("streamer-video");
        const content = document.createElement("video");
        content.srcObject = stream;
        content.addEventListener("loadedmetadata", () => {
          content.play();
        });
        streamerVideoDiv.append(content);
      });
    });

    return () => {
      disconnectSocket();
    };
  }, []);
peer.on('open',id=>{ socket.emit('join-room', roomId,id); }) работает нормально, это означает, что одноранговый узел может установить соединение с сервером.
Rahul 04.04.2021 08:17

Верно. Итак, ваш сокет генерирует событие join-room, и функция вызывается. Можете ли вы подключить console.info() к вашему экземпляру peer, чтобы убедиться, что он работает правильно?

cpppatrick 04.04.2021 08:21

да, сокет генерирует событие join-room

Rahul 04.04.2021 08:25

Кроме того, в функции connectToNewUser() это успешно регистрируется console.info('connectToNewUser',userId), но я думаю, что этот оператор не работает const call = peer.call(userId, stream)

Rahul 04.04.2021 08:27

Если есть время, можно пройти репо github.com/ats1999/conference

Rahul 04.04.2021 08:28

Я потратил много времени, но до сих пор не могу решить эту проблему.

Rahul 04.04.2021 08:28

Я вытащил ваш код и позже смогу изучить его более подробно. Но с первого взгляда две вещи. Сначала, когда я создаю комнату, а затем нажимаю «Присоединиться к комнате», я попадаю на страницу комнаты, но никакие данные недоступны при загрузке компонента. Ссылка на созданный экземпляр VideoApp отсутствует до тех пор, пока я не обновлю страницу. Во-вторых, при создании экземпляра VideoApp не устанавливается Peer ID. Я не знаю, потому что вы передаете undefined при его создании. Я смогу поискать больше позже, если вы еще не догадались.

cpppatrick 04.04.2021 17:38
until after I refresh the page, правда, прежде чем исправлю это я бы хотел исправить подключение peerjs
Rahul 04.04.2021 17:53
it's because you're passing in undefined причина, по которой я передаю undefined, заключается в том, что я хочу сгенерировать уникальный идентификатор пользователя сервером peerjs.
Rahul 04.04.2021 17:55
peerjs server->> Я установил peerjs глобально, затем запустил сервер
Rahul 04.04.2021 17:55
install-> npm i -g peerjs
Rahul 04.04.2021 17:56
run -> peerjs --port 5001
Rahul 04.04.2021 17:56

Спасибо за ваше драгоценное время.

Rahul 04.04.2021 17:56

Если вы хотите, чтобы сервер PeerJS генерировал идентификаторы, вы не передаете undefined. Вы можете просто создать одноранговый объект, например let my_peer = new Peer(). Если вам нужно запустить его на вашем собственном сервере, вам необходимо сгенерировать свой собственный идентификатор для каждого однорангового соединения. github.com/peers/peerjs-server

cpppatrick 05.04.2021 01:40

Я проверю, сработает это или нет.

Rahul 05.04.2021 05:50

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