问题描述
我正在尝试使用 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 (将#修改为@)