var layer; var playUrl= null; var loginTag = false; $(function () { layui.use(['layer'], function () { layer = layui.layer; }); getMedia(); }); /** * 获取播放信息 */ function getMedia() { var data = { id: cameraData.id, playType: cameraData.playType }; $.ajax({ type: 'POST', url: "/security/get-media", dataType: 'JSON', contentType: "application/json;charset=UTF-8", data: JSON.stringify(data), success: function (result) { if (result.code != "SUCCESS") { layer.msg(result.msg); } else { playUrl = result.playUrl; toPlay(); onLogin(); } }, error: function (result) { layer.msg(result.msg); } }); } /*============= webRtc视频播放 ----- 开始 ===============*/ /** * 开始播放 * @param winTag 播放窗口 * @returns {Promise} */ async function toPlay() { if(playUrl){ mediaStream = new MediaStream(); $("#video")[0].srcObject = mediaStream; webrtc = new RTCPeerConnection({ iceServers: [{ urls: ["stun:stun.l.google.com:19302"] }], sdpSemantics: "unified-plan" }); webrtc.onsignalingstatechange = signalingstatechange; webrtc.ontrack = ontrack let offer = await webrtc.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true }); await webrtc.setLocalDescription(offer); } } function ontrack(event) { mediaStream.addTrack(event.track); } async function signalingstatechange() { switch (webrtc.signalingState) { case 'have-local-offer': // let uuid = $('#uuid').val(); let url = playUrl + "?uuid=" + cameraData.id + "&channel=0"; $.post(url, { data: btoa(webrtc.localDescription.sdp) }, function (data) { try { console.log(data); webrtc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: atob(data) })) } catch (e) { console.warn(e); } }); break; case 'stable': break; case 'closed': break; default: console.log(`unhandled signalingState is ${webrtc.signalingState}`); break; } } /*============= 视频播放 ----- 结束 ===============*/ /** * * @param command 云台事件类型 * @param flag 是否停止相应事件 */ function handPTZ(command, flag){ if(!loginTag){ layer.alert("设备云台登录失败,请重试!"); return; } //大华云台控制 dhPlayerPTZ(command, flag); } /** * 云台控制 -预置位置调用 */ function handPreset() { } /*============= 大华JS云台控制 ----- 开始 ===============*/ /** * @description 设备登录 */ function onLogin (){ onLogout(); let ip = cameraData.ip; let port= cameraData.webPort; let user= cameraData.loginId; let pwd= cameraData.pwd; let target = ip + ':' + port; setIP(target); /** * RPC.login 登录 * @param {string} $user.value 用户名 * @param {string} $password.value 密码 * @param {boolean} false 是否httpOnly,默认false * @returns {Promise} */ RPC.login(user, pwd, false).then((res) => { setCookie('DWebClientSessionID', '', -1); setCookie('DhWebClientSessionID', '', -1); /** * RPC.keepAlive 保活 */ RPC.keepAlive(300, 60000, _getSession(), target, 0); const browser = BrowserType(); if (browser.includes('ie')) { window.onunload = () => { ajax({ url: 'global.logout' }); }; } else if (browser.includes('chrome')) { const params = { method: 'global.logout', params: null, id: 10000, session: _getSession() }; pubsub.subscribe('onbeforeunload',() => { navigator.sendBeacon('/RPC2', JSON.stringify(params)); }); } else { pubsub.subscribe('onbeforeunload',() => { ajax({ url: 'global.logout' }); }); } //登录成功,记录登录成功的硬盘录像机 loginTag = true; }).catch((err) => { console.log(err); }); } /** * @description 设备注销 */ function onLogout (){ /** * RPC.Global.logout 注销接口 * @returns {Promise} */ RPC.Global.logout().then(function() { setLoginState(false); playerInstance.forEach(item => { if(item) { item.stop(); item.close(); item = null; } loginTag = false; }); }); } /** * @description 设备云台事件 * @param {string} type 云台事件类型 * @param {boolean} isStop 是否停止相应事件 */ function dhPlayerPTZ (type, isStop) { //云台步长 // let stepVal = $_('#h5_ptz_step').value - 0; let stepVal = 5; let arg2 = 0; let arg2Arr = ['LeftUp', 'RightUp', 'LeftDown', 'RightDown']; let presetArr = ['GotoPreset','SetPreset', 'ClearPreset']; //预置点 // let presetNum = $_('#h5_preset').value - 0; let presetNum = 0; if(arg2Arr.indexOf(type) > -1) { arg2 = stepVal; } if(!isStop) { if(presetArr.indexOf(type) > -1) { /** * RPC.PTZManager 云台相关 * @param {string} 方法 * @param {number} channel 通道 * @param {object} 参数集合 */ RPC.PTZManager('start', 0, { 'code': type, 'arg1': presetNum, 'arg2': 0, 'arg3': 0 }); } else { RPC.PTZManager('start', 0, { 'code': type, 'arg1': stepVal, 'arg2': arg2, 'arg3': 0 }); } } else { RPC.PTZManager('stop', 0, { 'code': type, 'arg1': stepVal, 'arg2': arg2, 'arg3': 0 }); } } /*============= 大华JS云台控制 ----- 结束 ===============*/