未为浏览器调用 Kurento onicecandidate 事件

问题描述

我正在尝试使用 kurento 媒体服务器开发应用程序。我使用 NodeJS 作为应用程序服务器,使用 socket.io 进行信令和 kurento-client。在客户端,我使用 kurento-utils 库。 nodejs 和客户端页面间的 SDP 提供/应答机制按预期工作。我遇到了icecandidate 事件的问题。

正如文档中提到的,在创建接收 onicecandidate 的 webRtcPeer 时,我们需要将处理函数传递给 icecandidates 事件。 这是我使用 kurento-utils 库为客户端编写的完整代码,用于创建 webRtcPeer。

const socket = io();

const $videoLocal = document.querySelector(".local-video");
const $videoRemote = document.querySelector(".remote-video");

const $inputUsername = document.querySelector("#username");

const $btnCreateRoom = document.querySelector("#create-room");
const $btnJoinRoom = document.querySelector("#join-room");

let room = null,message = null,webRtcPeer = null;

let username = "";

socket.on("message",function (message) {
  switch (message.eventType) {
    case "icecandidate":
      console.log(message.candidate);
      webRtcPeer.addIceCandidate(message.candidate);
      break;

    default:
      break;
  }
});

$btnCreateRoom.addEventListener("click",async (e) => {
  e.preventDefault();
  username = $inputUsername.value;
  if (username !== "") {
    try {
      const { _webRtcPeer,sdpOffer } = await createWebRtcPeer();
      message = {
        eventType: "create-room",user: {
          username,},sdpOffer,};
      socket.emit("message",message,function (error,_room,sdpAnswer) {
        if (error) return console.log("unable to create room",error);
        room = _room;
        webRtcPeer.processAnswer(sdpAnswer);
      });
    } catch (error) {
      console.log(error);
    }
  } else {
    console.log("Username null");
  }
});

const createWebRtcPeer = function () {
  return new Promise((resolve,reject) => {
    const onIceCandidate = function (candidate) {
      console.log(candidate);
    };

    const options = {
      localVideo: $videoLocal,remoteVideo: $videoRemote,onicecandidate: onIceCandidate,mediaConstraints: {
        audio: true,video: true,configuration: {
        iceServers: [{ urls: "stun:stun.l.google.com:19302" }],};

    const _webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(
      options,function (error) {
        if (error) return reject(error);
        webRtcPeer = _webRtcPeer;
        // webRtcPeer.peerConnection.onicecandidate = function (event) {
        //   let message = {
        //     eventType: "icecandidate",//     candidate: event.candidate,//     room,//     user: {
        //       username,//     },//   };
        //   socket.emit("message",message);
        // };
        this.generateOffer((error,sdpOffer) => {
          if (error) return reject(error);
          resolve({ _webRtcPeer,sdpOffer });
        });
      }
    );
  });
};

如您所见,我尝试使用 webRtcPeer.peerConnection.onicecandidate 直接注册事件处理程序 RTCPeerConnection 对象。这部分代码如下:

// webRtcPeer.peerConnection.onicecandidate = function (event) {
        //   let message = {
        //     eventType: "icecandidate",message);
        // };

这成功地接收到了icecandidates,但我希望它只在 webRtcPeer 对象 onicecandiate 方法上接收,该方法不会被调用

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)