Hi All,
I’m trying to use a 3rd party LICode SDK and CefSharp to embed a web page into a Windows Application (C#). The web page requires the Web RTC with both Video and Audio functions to enable the communication inbetween teacher and students in the same classroom.
Currently the web page itself is running probably in Chrome browser. However when it is loaded in CefSharp Browser in the Windows Application, I could only see teacher or my own video stream, and when I click subscribeStream to see other students video stream, their video stream cannot be shown up.
In the Debug Panel of CefSharp, the following error message shows up:
ERROR: message: DOMException: Failed to set remote answer sdp: Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters… in baseStack at processAnswer erizo.js 1…
After reading Erizo.js, I believe the error occurred in this code section while it was trying to make a connection.
t.peerConnection = new RTCPeerConnection(t.pcConfig, t.con);
I assume t.con is the connection string to LICode server? Does it mean that I have to assign some value to t.con, before calling RTCPeerConnection?
#region Code Block
function (e, t, n) {
“use strict”;
const r = {
addSim: e => {
let t = “a=ssrc-group:SIM”;
return e.forEach(e => {
t += ${e}
}), ${t}\r\n
},
addGroup: (e, t) => a=ssrc-group:FID ${e} ${t}\r\n
,
addSpatialLayer: (e, t, n, r, i, o) => a=ssrc:${i} cname:${e}\r\n
+ a=ssrc:${i} msid:${t}\r\n
+ a=ssrc:${i} mslabel:${n}\r\n
+ a=ssrc:${i} label:${r}\r\n
+ a=ssrc:${o} cname:${e}\r\n
+ a=ssrc:${o} msid:${t}\r\n
+ a=ssrc:${o} mslabel:${n}\r\n
+ a=ssrc:${o} label:${r}\r\n
,
setMaxBW: (e, t) => {
let n, r, i = e;
return t.video && t.maxVideoBW && (null == (r = (i = i.replace(/b=AS:.\r\n/g, “”)).match(/m=video.\r\n/)) && (r = i.match(/m=video.\n/)), r && r.length > 0 && (n = ${r[0]}b=AS:${t.maxVideoBW}\r\n
, i = i.replace(r[0], n))), t.audio && t.maxAudioBW && (null == (r = i.match(/m=audio.\r\n/)) && (r = i.match(/m=audio.\n/)), r && r.length > 0 && (n = ${r[0]}b=AS:${t.maxAudioBW}\r\n
, i = i.replace(r[0], n))), i
},
enableOpusNacks: e => {
let t = e;
const n = t.match(/a=rtpmap:(.)opus.*\r\n/);
if (null !== n) {
const e = ${n[0]}a=rtcp-fb:${n[1]}nack\r\n
;
t = t.replace(n[0], e)
}
return t
}
};
t.a = r
}, function (e, t, n) {
“use strict”;
var r = n(1),
i = n(0);
t.a = (e => {
const t = {},
n = e;
let o, a;
i.a.info(“Starting Base stack”, n), t.pcConfig = {
iceServers: []
}, t.con = {}, void 0 !== n.iceServers && (t.pcConfig.iceServers = n.iceServers), void 0 === n.audio && (n.audio = !0), void 0 === n.video && (n.video = !0), n.remoteCandidates = [], n.localCandidates = [], n.remoteDescriptionSet = !1, t.mediaConstraints = {
offerToReceiveVideo: void 0 !== n.video && !1 !== n.video,
offerToReceiveAudio: void 0 !== n.audio && !1 !== n.audio
}, t.peerConnection = new RTCPeerConnection(t.pcConfig, t.con);
//Error SDP
console.log("pcConfig:" + t.pcConfig);
console.log("con:" + t.con);
const s = (e, t, n) => {
i.a.error("message:", n, "in baseStack at", e), void 0 !== t && t("error")
},
c = e => {
i.a.info("Success in BaseStack", e)
},
d = e => {
(o = e).sdp = r.a.setMaxBW(o.sdp, n), n.callback({
type: o.type,
sdp: o.sdp
}), i.a.info("Setting local description p2p", o), t.peerConnection.setLocalDescription(o).then(c).catch(s)
};
#endregion
Did you ever encounter any question similar? Could you share some ideas in this case?
Thanks in advance!