Javascript 如何在firefox中实现webRTC?

Javascript 如何在firefox中实现webRTC?,javascript,node.js,firefox,webrtc,Javascript,Node.js,Firefox,Webrtc,这段代码在google chrome fine中运行, 但我试图将其转换为支持Firefox 我总是在控制台中没有错误。 摄像机好像坏了,但没有录像。 这是剧本 var socket = new WebSocket('ws://127.0.0.1:1338/'); // change the IP address to your websocket server var stunServer = "stun.l.google.com:19302"; var sourcevid =

这段代码在google chrome fine中运行, 但我试图将其转换为支持Firefox 我总是在控制台中没有错误。 摄像机好像坏了,但没有录像。 这是剧本

  var socket = new WebSocket('ws://127.0.0.1:1338/');  // change the IP address to your websocket server
  var stunServer = "stun.l.google.com:19302";
  var sourcevid = document.getElementById('sourcevid');
  var remotevid = document.getElementById('remotevid');
  var localStream = null;
  var remoteStream;
  var peerConn = null;
  var started = false;
  var isRTCPeerConnection = true;
  var mediaConstraints = {mandatory: {
                            OfferToReceiveAudio:true, 
                            OfferToReceiveVideo:true }};

 var logg = function(s) { console.log(s); };



  // send the message to websocket server
  function sendMessage(message) {
      var mymsg = JSON.stringify(message);
      logg("SEND: " + mymsg);
      socket.send(mymsg);
  }

  function createPeerConnection() {
    try {
      logg("Creating peer connection");
      var servers = [];
      servers.push({'url':'stun:' + stunServer});
      var pc_config = {'iceServers':servers};     
      peerConn = new webkitRTCPeerConnection(pc_config);
      peerConn.onicecandidate = onIceCandidate;
    } catch (e) {
        try {
          peerConn = new RTCPeerConnection('STUN ' + stunServer, onIceCandidate00);
          isRTCPeerConnection = false;
        } catch (e) {
          logg("Failed to create PeerConnection, exception: " + e.message);
        }
    }

    peerConn.onaddstream = onRemoteStreamAdded;
    peerConn.onremovestream = onRemoteStreamRemoved;
  }

  // when remote adds a stream, hand it on to the local video element
  function onRemoteStreamAdded(event) {
    logg("Added remote stream");
    remotevid.src = window.webkitURL.createObjectURL(event.stream);
  }

   function waitForRemoteVideo() {
    if (remoteStream.videoTracks.length === 0 || remotevid.currentTime > 0) {
      transitionToActive();
    } else {
      setTimeout(waitForRemoteVideo, 100);
    }
  }

    function transitionToActive() {
    remotevid.style.opacity = 1;
    card.style.webkitTransform = "rotateY(180deg)";
    setTimeout(function() { sourcevid.src = ""; }, 500);
    setStatus("<input type=\"button\" id=\"hangup\" value=\"Hang up\" onclick=\"onHangup()\" />");
  }

  // when remote removes a stream, remove it from the local video element
  function onRemoteStreamRemoved(event) {
    logg("Remove remote stream");
    remotevid.src = "";
  }

  function onIceCandidate(event) {
    if (event.candidate) {
      sendMessage({type: 'candidate',
                   label: event.candidate.sdpMLineIndex,
                   id: event.candidate.sdpMid,
                   candidate: event.candidate.candidate});
    } else {
      logg("End of candidates.");
    }
  }

  function onIceCandidate00(candidate, moreToFollow) {
    if (candidate) {
        sendMessage({type: 'candidate', label: candidate.label, candidate: candidate.toSdp()});
    }
    if (!moreToFollow) {
      logg("End of candidates.");
    }
  }

  // start the connection upon user request
  function connect() {
    if (!started && localStream) {

      console.log("Creating PeerConnection.");
      createPeerConnection();
      logg('Adding local stream...');
      peerConn.addStream(localStream);
      started = true;
      logg("isRTCPeerConnection: " + isRTCPeerConnection);

      //create offer
      if (isRTCPeerConnection) {
        peerConn.createOffer(setLocalAndSendMessage, null, mediaConstraints);
      } else {
        var offer = peerConn.createOffer(mediaConstraints);
        peerConn.setLocalDescription(peerConn.SDP_OFFER, offer);
        sendMessage({type: 'offer', sdp: offer.toSdp()});
        peerConn.startIce();
      }

    } else {
      alert("Local stream not running yet.");
    }
  }

  // accept connection request
  socket.addEventListener("message", onMessage, false);
  function onMessage(evt) {
    logg("RECEIVED: " + evt.data);
    if (isRTCPeerConnection)
      processSignalingMessage(evt.data);
    else
      processSignalingMessage00(evt.data);
  }

  function processSignalingMessage(message) {
    var msg = JSON.parse(message);

    if (msg.type === 'offer') {

      if (!started && localStream) {
        createPeerConnection();
        logg('Adding local stream...');
        peerConn.addStream(localStream);
        started = true;
        logg("isRTCPeerConnection: " + isRTCPeerConnection);


        if (isRTCPeerConnection) {
          //set remote description
          peerConn.setRemoteDescription(new RTCSessionDescription(msg));
          //create answer
          console.log("Sending answer to peer.");
          peerConn.createAnswer(setLocalAndSendMessage, null, mediaConstraints);
        } else {
          //set remote description
          peerConn.setRemoteDescription(peerConn.SDP_OFFER, new SessionDescription(msg.sdp));
          //create answer
          var offer = peerConn.remoteDescription;
          var answer = peerConn.createAnswer(offer.toSdp(), mediaConstraints);
          console.log("Sending answer to peer.");
          setLocalAndSendMessage00(answer);
        }
      }

    } else if (msg.type === 'answer' && started) {
      peerConn.setRemoteDescription(new RTCSessionDescription(msg));
    } else if (msg.type === 'candidate' && started) {
      var candidate = new RTCIceCandidate({sdpMLineIndex:msg.label, candidate:msg.candidate});
      peerConn.addIceCandidate(candidate);
    } else if (msg.type == 'chat'){
        addChatMsg(msg.nick, msg.cid, msg.data);
    } 
    else if (msg.type === 'bye' && started) {
      onRemoteHangUp();
    }
  }

  function processSignalingMessage00(message) {
    var msg = JSON.parse(message);

    // if (msg.type === 'offer')  --> will never happened since isRTCPeerConnection=true initially
    if (msg.type === 'answer' && started) {
      peerConn.setRemoteDescription(peerConn.SDP_ANSWER, new SessionDescription(msg.sdp));
    } else if (msg.type === 'candidate' && started) {
      var candidate = new IceCandidate(msg.label, msg.candidate);
      peerConn.processIceMessage(candidate);
    } else if (msg.type === 'bye' && started) {
      onRemoteHangUp();
    }
  }

  function setLocalAndSendMessage(sessionDescription) {
    peerConn.setLocalDescription(sessionDescription);
    sendMessage(sessionDescription);
  }

  function setLocalAndSendMessage00(answer) {
    peerConn.setLocalDescription(peerConn.SDP_ANSWER, answer);
    sendMessage({type: 'answer', sdp: answer.toSdp()});
    peerConn.startIce();
  }

  function onRemoteHangUp() {
    logg("Remote Hang up.");
    closeSession();
  }

  function onHangUp() {
    logg("Hang up.");
    if (started) {
      sendMessage({type: 'bye'});
      closeSession();
    }
  }

  function closeSession() {
    peerConn.close();
    peerConn = null;
    started = false;
    remotevid.src = ""; 
  }

  window.onbeforeunload = function() {
    if (started) {
      sendMessage({type: 'bye'});
    }
  }

  function startVideo() {
      // Replace the source of the video element with the stream from the camera
      if (navigator.mozGetUserMedia) { 
      try { 
        navigator.mozGetUserMedia({audio: true, video: true}, successCallback, errorCallback);
      } catch (e) {
        navigator.mozGetUserMedia("video,audio", successCallback, errorCallback);
      }
      }
      else { 
      try { 
        navigator.webkitGetUserMedia({audio: true, video: true}, successCallback, errorCallback);
      } catch (e) {
        navigator.webkitGetUserMedia("video,audio", successCallback, errorCallback);
      }
      }
      function successCallback(stream) {
      if (navigator.mozGetUserMedia) { 
          sourcevid.mozSrcObject = stream;
          sourcevid.style.webkitTransform = "rotateY(180deg)";
          localStream = stream;
          }
      if(navigator.webkitGetUserMedia){
        sourcevid.src = window.webkitURL.createObjectURL(stream);
        sourcevid.style.webkitTransform = "rotateY(180deg)";
        localStream = stream;
    } 

      }
      function errorCallback(error) {
          logg('An error occurred: [CODE ' + error.code + ']');
      }
  }

  function stopVideo() {
    sourcevid.src = "";
  }
var-socket=new-WebSocket('ws://127.0.0.1:1338/');//更改websocket服务器的IP地址
var stunServer=“stun.l.google.com:19302”;
var sourcevid=document.getElementById('sourcevid');
var remotevid=document.getElementById('remotevid');
var localStream=null;
远程流;
var peerConn=null;
var=false;
var isrtpeerconnection=true;
var mediaConstraints={必需:{
OfferToReceiveAudio:正确,
OfferToReceiveVideo:true}};
var logg=函数{console.log;};
//将消息发送到websocket服务器
函数sendMessage(消息){
var mymsg=JSON.stringify(消息);
日志(“发送:+mymsg”);
socket.send(mymsg);
}
函数createPeerConnection(){
试一试{
logg(“创建对等连接”);
var服务器=[];
push({'url':'stun:'+stunServer});
var pc_config={'iceServers':servers};
peerConn=新的WebKitRTPeerConnection(pc_配置);
peerConn.onicecandidate=onicecandidate;
}捕获(e){
试一试{
peerConn=新的RTCPeerConnection('STUN'+stunServer,onIceCandidate00);
isrtpeerconnection=false;
}捕获(e){
logg(“未能创建对等连接,异常:+e.message”);
}
}
peerConn.onaddstream=onRemoteStreamAdded;
peerConn.onremovestream=onRemoteStreamRemoved;
}
//当remote添加流时,将其交给本地视频元素
添加了函数onRemoteStream(事件){
logg(“添加的远程流”);
remotevid.src=window.webkitURL.createObjectURL(event.stream);
}
函数waitForRemoteVideo(){
if(remoteStream.videoTracks.length==0 | | remotevid.currentTime>0){
transitionactive();
}否则{
设置超时(waitForRemoteVideo,100);
}
}
函数transitionactive(){
remotevid.style.opacity=1;
card.style.webkitttransform=“旋转(180度)”;
setTimeout(函数(){sourcevid.src=”“;},500);
设置状态(“”);
}
//远程删除流时,请将其从本地视频元素中删除
函数onRemoteStreamRemoved(事件){
logg(“删除远程流”);
remotevid.src=“”;
}
函数onIceCandidate(事件){
if(事件候选){
sendMessage({type:'candidate',
标签:event.candidate.sdpMLineIndex,
id:event.candidate.sdpMid,
候选:event.candidate.candidate});
}否则{
logg(“候选人结束”);
}
}
函数onIceCandidate00(候选函数,更多如下){
如果(候选人){
sendMessage({type:'candidate',label:candidate.label,candidate:candidate.toSdp()});
}
如果(!moretfollow){
logg(“候选人结束”);
}
}
//根据用户请求启动连接
函数连接(){
如果(!started&&localStream){
log(“创建对等连接”);
createPeerConnection();
logg('添加本地流…');
peerConn.addStream(localStream);
开始=真;
日志(“ISRTPEERCONNECTION:+ISRTPEERCONNECTION”);
//创建报价
if(ISRTPeerConnection){
createOffer(setLocalAndSendMessage,null,mediaConstraints);
}否则{
var offer=peerConn.createOffer(mediaConstraints);
peerConn.setLocalDescription(peerConn.SDP_OFFER,OFFER);
sendMessage({type:'offer',sdp:offer.toSdp()});
peerConn.startIce();
}
}否则{
警报(“本地流尚未运行”);
}
}
//接受连接请求
addEventListener(“message”,onMessage,false);
消息函数(evt){
日志(“收到:+evt.数据”);
if(ISRTPeerConnection)
处理信号消息(evt.data);
其他的
ProcessingSignalingMessage00(evt.data);
}
函数processSignalingMessage(消息){
var msg=JSON.parse(消息);
如果(msg.type==='offer'){
如果(!started&&localStream){
createPeerConnection();
logg('添加本地流…');
peerConn.addStream(localStream);
开始=真;
日志(“ISRTPEERCONNECTION:+ISRTPEERCONNECTION”);
if(ISRTPeerConnection){
//设置远程描述
setRemoteDescription(新的RTCSessionDescription(msg));
//创建答案
log(“向对等方发送应答”);
createAnswer(setLocalAndSendMessage,null,mediaConstraints);
}否则{
//设置远程描述
peerConn.setRemoteDescription(peerConn.SDP_OFFER,新SessionDescription(msg.SDP));
//创建答案
var offer=peerConn.remoteDescription;
var answer=peerConn.createAnswer(offer.toSdp(),mediaConstraints);
log(“向对等方发送应答”);
setLocalAndSendMessage00(应答);
}
}
}else if(msg.type==='answer'&&started){
setRemoteDescription(新的RTCSessionDescription(msg));
}else if(msg.type=='candidate'&&started){
var-candidate=new-RTCIceCandidate({sdpMLineIndex:msg.label,candidate:msg.candidate});
peerConn.addIceCandidate(候选);
}else if(msg.type=='chat'){
addChatMsg(msg.nick、msg.cid、msg.data);
} 
else if(msg.type==='bye'&&started){
onRemoteHangUp();
}
}
函数processSignalingMessage00(消息){
var msg=JSON.parse(消息);
//如果(msg.type=='offer')-->将永远不会发生,因为最初isrtpeerconnection=true
if(msg.type==='answer'&&started){
peerConn.setRemoteDescription(peerConn.SDP_答案,新会话描述(msg.SDP));
}else if(msg.type=
<script type="text/javascript" src="{{ asset('bundles/PFESiivt/js/visio.js') }}"></script>

<div id="main">
    <div id="" style="height:280px;width:700;">
        <div id="livevideodivk" style="float:left;">
            <video id="sourcevid" style="height:280px;width:320px;" autoplay></video>
        </div>

        <div id="remotevideodivk" style="float:left;margin-left:10px">
            <video id="remotevid" style="height:280px;width:320px;" autoplay></video>
        </div>
    </div>
    <center>
        <button id="btn" type="button" onclick="startVideo();">Start video</button>
        <button id="btn" type="button" onclick="stopVideo();">Stop video</button>
        <button id="btn" type="button" onclick="connect();">Connect</button>
        <button id="btn" type="button" onclick="onHangUp();">Hang Up</button>
    </center>


</div>