var outgoingSession = null,incomingSession = null,currentSession = null,nativeStream = null,callVideoState= null,callVideoFail = null, inComing = true,sip_uri_, sip_password_, ws_uri_,localStream = null,userAgent = null,currentVideoIndex = 0,registrationState = null; var getWidthScale = document.documentElement.clientWidth; //监测浏览器的宽度 var myVideoView = document.getElementById('myVideo'); //我的本地视频 var videoView_1 = document.getElementById('videoView'); //对方的视频信息 console.log(getWidthScale) $(function(){ $(".videoList").css({ "height":getWidthScale*0.8/1.6+"px", }) $(".videoMy").css({ "height":getWidthScale*0.8/1.6+"px", }) }) //开启本地摄像头 function captureLocalMediaVideo() { navigator.getUserMedia({ video: true, audio: false }, function(stream) { nativeStream = stream; myVideoView.srcObject = stream; }, function(e) { alert('getUserMedia() error: ' + e.name); }); } //获取本地媒体流 function localMediaStream() { navigator.getUserMedia({ video:true, audio: true }, function(stream) { if(callVideoState){ localStream = stream; sipCallVideo(); } }, function(e) { alert('getUserMedia() error: ' + e.name); }); } // 关闭摄像头 function closeMediaVideo() { //console.log("1213") if(nativeStream){ nativeStream.getTracks().forEach(function(track) { track.stop(); }); } if(localStream){ localStream.getTracks().forEach(function(track) { track.stop(); }); } } function testStart() { // sip_uri_ = "sip:" + selectExten + "@zmd.xjt.net.cn"; //zmd.xjt.net.cn sip.800100.com.cn // sip_password_ = selectExten.toString(); //zhumadian12345800100 //sip_uri_ = "sip:" + selectExten + "@12345sp1.zhumadian.gov.cn"; // 12345sp.zwfw.anyang.gov.cn sip_uri_ = "sip:" + selectExten + "@12345sp.zwfw.anyang.gov.cn"; sip_password_ = "123456"; //zhumadian12345800100 //ws_uri_ = "wss://zmd.xjt.net.cn:7443"; //ws_uri_ = "wss://12345sp2.zhumadian.gov.cn:7443"; ws_uri_ = "wss://12345sp.zwfw.anyang.gov.cn:7443"; console.info("get input info: sip_uri = ", sip_uri_, " sip_password = ", sip_password_, " ws_uri = ", ws_uri_); var socket = new JsSIP.WebSocketInterface(ws_uri_); var configuration = { sockets: [socket], outbound_proxy_set: ws_uri_, uri: sip_uri_, //与用户代理关联的SIP URI(字符串)。这是您的提供商提供给您的SIP地址 password: sip_password_, //SIP身份验证密码 contact_uri: 'sip:'+selectExten+'@12345sp1.zhumadian.gov.cn;transport=wss', //stun_servers: stun_servers, //contact_uri: 'sip:'+extno+'@'+returnCitySN["cip"]+';transport=ws', register: true, //指示启动时JsSIP用户代理是否应自动注册 session_timers: false,//启用会话计时器(根据RFC 4028) }; userAgent = new JsSIP.UA(configuration); //成功注册成功,data:Response JsSIP.IncomingResponse收到的SIP 2XX响应的实例 userAgent.on('registered', function(data) { console.info("registered: ", data.response.status_code, ",", data.response.reason_phrase); $(".titText").show(); $(".titText").html(selectExten + "注册成功"); registrationState = true; top.Connect(); }); //由于注册失败而被解雇,data:Response JsSIP.IncomingResponse接收到的SIP否定响应的实例,如果失败是由这样的响应的接收产生的,否则为空 userAgent.on('registrationFailed', function(data) { console.log("registrationFailed, ", data); //console.warn("registrationFailed, ", data.response.status_code, ",", data.response.reason_phrase, " cause - ", data.cause); }); //1.在注册到期之前发射几秒钟。如果应用程序没有为这个事件设置任何监听器,JsSIP将像往常一样重新注册。 userAgent.on('registrationExpiring', function() { //==console.warn("registrationExpiring"); }); //为传入或传出会话/呼叫激发。data: userAgent.on('newRTCSession', function(data) { //console.info('onNewRTCSession: ', data); console.info('onNewRTCSession: ', data); var originator = data.originator; var session = data.session; var request = data.request; if (data.originator == 'remote') { //incoming call //console.log(JSON.stringify(data)); console.info("incomingSession, answer the call"); incomingSession = data.session; $(".videoBtn").show(); $(".vidDrop").hide(); $(".videoCall").show(); $(".videoList").hide(); $(".videoMy").hide(); $('.maxOpen').trigger("click"); captureLocalMediaVideo() localMediaStream() } else { console.info("2"); //console.info("outgoingSession"); outgoingSession = data.session; outgoingSession.on('connecting', function(data) { //console.info('onConnecting - ', data.request); currentSession = outgoingSession; outgoingSession = null; }); } //接受呼叫时激发 data.session.on('accepted', function(data) { console.info("3"); //console.info('onAccepted - ', data); if (data.originator == 'remote' && currentSession == null) { currentSession = incomingSession; incomingSession = null; //console.info("setCurrentSession - ", currentSession); } }); //确认呼叫后激发 data.session.on('confirmed', function(data) { console.info("4"); //console.info('onConfirmed - ', data); $(".callStyle").text("通话中"); if (data.originator == 'remote' && currentSession == null) { currentSession = incomingSession; incomingSession = null; //console.info("setCurrentSession - ", currentSession); } }); //在将远程SDP传递到RTC引擎之前以及在发送本地SDP之前激发。此事件提供了修改传入和传出SDP的机制。 data.session.on('sdp', function(data) { console.info("5"); }); //接收或生成对邀请请求的1XX SIP类响应(>100)时激发。该事件在SDP处理之前触发(如果存在),以便在需要时对其进行微调,甚至通过删除数据对象中响应参数的主体来删除它 data.session.on('progress', function(data) { console.info("6"); //console.info('onProgress - ', data.originator); if (data.originator == 'remote') { //console.info('onProgress, response - ', data.response); } }); //创建基础RTCPeerConnection后激发。应用程序有机会通过在peerconnection上添加RTCDataChannel或设置相应的事件侦听器来更改peerconnection。 data.session.on('peerconnection', function(data) { console.info('onPeerconnection ----创建基础RTCPeerConnection后激发 '); var datachannel; datachannel = data.peerconnection.createDataChannel('chat'); console.log("1111" + datachannel) callVideoFail = false; if (inComing) { inComing =false; data.peerconnection.onaddstream = function(ev) { $(".videoMy").show(); $(".videoBtn").hide(); $(".videoList").show(); $(".vidDrop").show(); videoView_1.srcObject = ev.stream; } } }); }); //为传入或传出消息请求激发。data: // originator:'remote',新消息由远程对等方生成;'local',新消息由本地用户生成。 // message:JsSIP.Message 实例。 // request:JsSIP.IncomingRequest收到的MESSAGE请求的实例;JsSIP.OutgoingRequest传出MESSAGE请求的实例 userAgent.on('newMessage', function(data) { console.info("8"); if (data.originator == 'local') { //console.info('onNewMessage , OutgoingRequest - ', data.request); } else { //console.info('onNewMessage , IncomingRequest - ', data.request); } }); console.info("call register"); //连接到信令服务器,并恢复以前的状态,如果以前停止。重新开始时,如果UA配置中的参数设置为register:true,则向SIP域注册。 userAgent.start(); } // Register callbacks to desired call events var eventHandlers = { 'progress': function(e) { console.log('call is in progress'); }, 'failed': function(e) { console.log('call failed: ', e); if(callVideoFail){ setTimeout(function(){videoCall()},2000) } }, 'ended': function(e) { console.log('call ended : ', e); dropCall(); }, 'confirmed': function(e) { console.log('call confirmed'); } }; //视频呼叫 function audioCall(callPhone) { if($("#numberCall").val()<1005||$("#numberCall").val()>1010){ alert("账号不正确,请重新输入") } else{ inComing = true callVideoState = true ; localMediaStream(); captureLocalMediaVideo(); $(".videoCall").show(); $(".callStyle").text("连接中"); } } function sipCallVideo(){ callVideoFail = true; if(localStream){ var sip_phone_number_ = $("#numberCall").val().toString(); var options = { 'eventHandlers': eventHandlers, 'mediaConstraints': { 'audio': true, 'video': { 'width': 320, 'height': 240 } }, 'mediaStream': localStream }; callVideoState = false; outgoingSession = userAgent.call(sip_phone_number_, options); } } //接听 function answerCall() { inComing = true; console.log(incomingSession) if (incomingSession) { incomingSession.answer({ 'mediaConstraints': { 'audio': true, 'video': { 'width': 320, 'height': 240 } }, 'mediaStream': localStream }); incomingSession = null; } } //注销 function unReg() { console.log('注销----------->'); userAgent.unregister(true); } //挂断 function dropCall() { console.log('挂断----------->'); userAgent.terminateSessions(); $(".callStyle").text("") closeMediaVideo(); $(".videoCall").hide(); }