【发布时间】:2020-08-26 09:39:41
【问题描述】:
在任何事情之前!我已经检查了类似问题的所有答案,但答案既无用又陈旧。 我曾尝试在 Firefox 上使用 webrtc,但它没有用!并且没有给出错误!
此代码适用于除 firefox 以外的所有浏览器
这是我的代码
let configuration = {
"iceServers":[{
'url':'stun:stun.l.google.com:19302'
}]
};
io.on("signaling_message",(data)=>{
//displayMessage(data.message);
if(!rtcPeerConn){
startSignaling();
}
if(data.type!="user_here"){
let message = JSON.parse(data.message);
if(message.sdp){
rtcPeerConn.setRemoteDescription(new RTCSessionDescription(message.sdp),()=>{
if(rtcPeerConn.remoteDescription.type=="offer"){
rtcPeerConn.createAnswer(sendLocalDesc,logerror)
}
})
}else{
rtcPeerConn.addIceCandidate(new RTCIceCandidate(message.candidate));
}
}
})
function startSignaling(){
displayMessage("start signaling...");
rtcPeerConn = new RTCPeerConnection(configuration);
//send ice candidate to other peer
rtcPeerConn.onicecandidate = function(evt){
if(evt.candidate){
io.emit("signal",{"type":"ice candidate","message":JSON.stringify({'candidate':evt.candidate}),room:signal_room})
displayMessage("completed that ice candidate");
}
}
rtcPeerConn.onnegotiationneeded = function(){
displayMessage("on negotiationnneded");
rtcPeerConn.createOffer(sendLocalDesc,logerror);
}
rtcPeerConn.onaddstream = (evt,err)=>{
displayMessage("creating the other stream");
if(err){
displayMessage(err)
}
success2(evt.stream);
}
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(stream=>{
success(stream);
rtcPeerConn.addStream(stream);
}).catch(err=>{
logerror(err);
});
}
function sendLocalDesc(desc){
rtcPeerConn.setLocalDescription(desc,()=>{
displayMessage("set local description");
io.emit("signal",{type:"SDP",message:JSON.stringify({'sdp':rtcPeerConn.localDescription}),room:signal_room})
},logerror);
}
function success(stream){
if ("srcObject" in video) {
video.srcObject = stream;
} else {
// Avoid using this in new browsers, as it is going away.
video.src = window.URL.createObjectURL(stream);
}
video.play();
}
function success2(stream){
if ("srcObject" in video2) {
video2.srcObject = stream;
} else {
// Avoid using this in new browsers, as it is going away.
video2.src = window.URL.createObjectURL(stream);
}
video2.play();
}
我的代码有什么问题吗?
另一个问题,我可以在生产中使用 google stun iceservers 吗?他们可靠吗?
编辑
firefox 卡在这个脚本上
rtcPeerConn.onicecandidate = function(evt){
if(evt.candidate){
io.emit("signal",{"type":"ice candidate","message":JSON.stringify({'candidate':evt.candidate}),room:signal_room})
displayMessage("completed that ice candidate");
}
}
它像循环一样不断显示此消息(完成了那个冰候选)
【问题讨论】:
标签: javascript html webrtc