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<void>}
|
*/
|
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云台控制 ----- 结束 ===============*/
|