632 lines
21 KiB
JavaScript
632 lines
21 KiB
JavaScript
var loginName = "admin";
|
||
var password = "bns@Admin1";
|
||
var webSocket;
|
||
var tokens;
|
||
var token = localStorage.getItem("token");
|
||
$(function () {
|
||
//键盘监听事件——本地截屏
|
||
document.onkeydown = function (event) {
|
||
let e = event || window.event || arguments.callee.caller.arguments[0];
|
||
if (e && e.code === "KeyB") { // Ctrl_B
|
||
if (playBallList.length === 0) {
|
||
layer.msg("请先播放视频", {icon: 2});
|
||
} else {
|
||
screenshot(selectedScreen);
|
||
}
|
||
|
||
}
|
||
};
|
||
//初始化菜单
|
||
$.contextMenu({
|
||
selector: '.flv_video',
|
||
build: function ($trigger, e) {
|
||
let remoteVideo = "开启云录像";
|
||
let threeD = "开启3D云平台";
|
||
let localVideo = "开启本地录像";
|
||
let id = $trigger.closest("div").attr("id");
|
||
ballScreen(id);
|
||
$.each(playBallList, function (index, item) {
|
||
if (!isEmpty(item)) {
|
||
if (id === item.selectedScreen) {
|
||
if (!isEmpty(item.id)) {
|
||
remoteVideo = "关闭云录像";
|
||
} else {
|
||
remoteVideo = "开启云录像";
|
||
}
|
||
}
|
||
}
|
||
})
|
||
$.each(playBallList, function (index, item) {
|
||
if (!isEmpty(item)) {
|
||
if (id === item.selectedScreen)
|
||
if (!isEmpty(item.recordVideo)) {
|
||
if (item.recordVideo) {
|
||
localVideo = "开启本地录像";
|
||
} else {
|
||
localVideo = "关闭本地录像";
|
||
}
|
||
}
|
||
}
|
||
})
|
||
let threeDState = localStorage.getItem(id + "_3d")
|
||
if (threeDState === "true") {
|
||
threeD = "关闭3D云平台";
|
||
threeDState = false;
|
||
} else {
|
||
threeD = "开启3D云平台";
|
||
threeDState = true;
|
||
}
|
||
return {
|
||
callback: function (key, options) {
|
||
let videoId = $(this).closest("div").attr("id");
|
||
$.each(playBallList, function (index, item) {
|
||
if (!isEmpty(item)) {
|
||
if (videoId === item.selectedScreen) {
|
||
switch (key) {
|
||
case "stop":
|
||
H5Live.DestoryWindows(item.selectedScreen);
|
||
if (item.flvJs) {
|
||
destoryVideo(item.flvJs);
|
||
item.flvJs = null;
|
||
} else {
|
||
H5Live.DestoryWindows(item.selectedScreen);
|
||
}
|
||
$.each(videoList, function (index, item) {
|
||
if (videoId === item.selectedScreen) {
|
||
item.playState = false;
|
||
}
|
||
});
|
||
playBallList.splice(index, 1);
|
||
$("#" + videoId).html("");
|
||
break;
|
||
case "details":
|
||
let height = getDefaultHeight().toFixed(0) + 'px';
|
||
let width = getDefaultWidth().toFixed(0) + 'px';
|
||
layer.open({
|
||
title: false,
|
||
type: 2,
|
||
content: '../video/videoDetails.html?puid=' + item.puid,
|
||
skin: 'my-skin detail-skin',
|
||
area: [width, height],
|
||
maxmin: false,
|
||
move: false,
|
||
offset: ['8%', '25%'],
|
||
shadeClose: true,
|
||
shade: 0.5,
|
||
success: function (layero, index) {
|
||
$(window).resize(function () {
|
||
if (autoResizeWidth) {
|
||
autoResizeWidth(index);
|
||
}
|
||
if (autoResizeHeight) {
|
||
autoResizeHeight(index);
|
||
}
|
||
})
|
||
}
|
||
});
|
||
break;
|
||
case "localCapture":
|
||
screenshot(videoId);
|
||
break;
|
||
case "3D":
|
||
localStorage.setItem(selectedScreen + "_3d", threeDState);//默认开启
|
||
break;
|
||
case "localVideo":
|
||
document.getElementById("localVideoBtn").click();
|
||
break;
|
||
case "remoteCapture":
|
||
document.getElementById("remoteSnapBtn").click();
|
||
break;
|
||
case "remoteVideo":
|
||
document.getElementById("remoteVideoBtn").click();
|
||
break;
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
});
|
||
|
||
},
|
||
items: {
|
||
"stop": {
|
||
name: "停止播放"
|
||
},
|
||
"stopAll": {
|
||
name: "停止所有播放",
|
||
callback: function (key, options) {
|
||
$.each(playBallList, function (indexs, item) {
|
||
if (!isEmpty(item)) {
|
||
if (item.flvJs) {
|
||
destoryVideo(item.flvJs);
|
||
item.flvJs = null;
|
||
} else {
|
||
H5Live.DestoryWindows(item.selectedScreen);
|
||
}
|
||
}
|
||
$("#" + item.selectedScreen).html("");
|
||
});
|
||
playBallList = [];
|
||
$.each(videoList, function (index, item) {
|
||
if (index < num) {
|
||
item.playState = false;
|
||
}
|
||
});
|
||
}
|
||
},
|
||
"details": {
|
||
name: "球机详情"
|
||
},
|
||
"3D": {
|
||
name: threeD
|
||
},
|
||
"localCapture": {
|
||
name: "本地抓拍"
|
||
},
|
||
"localVideo": {
|
||
name: localVideo
|
||
},
|
||
"remoteCapture": {
|
||
name: "云抓拍"
|
||
},
|
||
"remoteVideo": {
|
||
name: remoteVideo
|
||
}
|
||
}
|
||
};
|
||
},
|
||
|
||
|
||
});
|
||
});
|
||
|
||
|
||
/**
|
||
* 获取创世websocket地址
|
||
*/
|
||
function getCSWebSocket() {
|
||
$.ajax({
|
||
url: dataUrl + "video/getCSWebSocket?token=" + token,
|
||
type: "POST",
|
||
data: {name: loginName, passwd: password, token: token},
|
||
success: function (data) {
|
||
if (data.resMsg === 'success') {
|
||
var jsons = JSON.parse(data.obj);
|
||
webSocket = jsons.content.Addr;
|
||
if (webSocket.indexOf("127.0.0.1") != -1) {
|
||
webSocket = webSocket.replace("127.0.0.1", "112.30.98.105");
|
||
}
|
||
}
|
||
}, error: function (error) {
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 创建清新平台连接
|
||
*/
|
||
function getQXConnect() {
|
||
let params = {
|
||
"address": _cf.connParams.address,
|
||
"port": _cf.connParams.port,
|
||
"user": _cf.connParams.user,
|
||
"password": _cf.connParams.password,
|
||
"epid": _cf.connParams.epid,
|
||
"fixaddr": _cf.connParams.bfix
|
||
}
|
||
requestPost('login', params, function (rv) {
|
||
let result = {
|
||
errcode: -1,
|
||
token: ''
|
||
}
|
||
let respJSON = JSON.parse(rv.responseText);
|
||
if (respJSON.hasOwnProperty('errcode')) {
|
||
result.errcode = respJSON.errcode;
|
||
}
|
||
if (respJSON.hasOwnProperty('token')) {
|
||
result.token = respJSON.token;
|
||
result.errcode = 0;
|
||
tokens = result.token;
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* post 请求
|
||
* @param router
|
||
* @param params
|
||
* @param callback
|
||
*/
|
||
function requestPost(router, params, callback) {
|
||
$.ajax({
|
||
type: 'post',
|
||
url: _cf.q2http_url + router,
|
||
data: params,
|
||
traditional: true,
|
||
dataType: 'json',
|
||
async: true,
|
||
complete: function (rv) {
|
||
if (typeof callback == 'function') callback(rv)
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 创世云台控制
|
||
* @param puid
|
||
* @param {Object} type
|
||
*/
|
||
/*function csBallPTZ(puid, type) {
|
||
$.ajax({
|
||
url: ctxPath + "/base/getCSBallPTZControl",
|
||
type: "POST",
|
||
data: {
|
||
puid: puid,
|
||
type: type,
|
||
token: token
|
||
},
|
||
success: function (data) {
|
||
},
|
||
error: function (error) {
|
||
}
|
||
});
|
||
}*/
|
||
|
||
/**
|
||
*操作记录
|
||
*/
|
||
function record(puid, details, module) {
|
||
$.ajax({
|
||
url: ctxPath + "/logs/addBallLogs?token=" + token,
|
||
type: "GET",
|
||
data: {
|
||
puid: puid,
|
||
details: details,
|
||
module: module,
|
||
token: token
|
||
},
|
||
success: function (data) {
|
||
},
|
||
error: function (error) {
|
||
}
|
||
});
|
||
|
||
}
|
||
|
||
/**
|
||
* 远程录像/抓拍
|
||
* @param puid 球机puid
|
||
* @param type 操作类型
|
||
* @param typeBall 平台类型
|
||
*/
|
||
function remote(puid, type, typeBall) {
|
||
if (typeBall === 0) {
|
||
//创世
|
||
type = type === 0 ? "REALTIME" : "PICTURE";
|
||
$.ajax({
|
||
url: ctxPath + "/base/remote",
|
||
type: "POST",
|
||
data: {
|
||
puid: puid,
|
||
type: type,
|
||
action: "ManualStartPlateformStorage",
|
||
token: token
|
||
},
|
||
success: function (data) {
|
||
if (type === "REALTIME") {
|
||
layer.msg("开始录像成功", {icon: 1});
|
||
$.each(playBallList, function (index, item) {
|
||
if (selectedScreen === item.selectedScreen) {
|
||
item.id = true;
|
||
}
|
||
});
|
||
record(puid, document.title, "远程11录像")
|
||
} else {
|
||
layer.msg("抓拍成功", {icon: 1});
|
||
setTimeout("stopRemote(\"" + puid + "\",null, 1,0)", 2000);
|
||
record(puid, document.title, "远程抓拍")
|
||
}
|
||
},
|
||
error: function (error) {
|
||
}
|
||
});
|
||
|
||
} else {
|
||
//清晰
|
||
let params = {
|
||
idx: 0,
|
||
puid: puid,
|
||
type: type,
|
||
duration: 5
|
||
}
|
||
requestPost("CSS/C_CSS_StartManualStorage" + "?token=" + tokens, params, function (data) {
|
||
if (data.responseJSON.Error === '0') {
|
||
if (type === 0) {
|
||
layer.msg("开始录像成功", {icon: 1});
|
||
record(puid, document.title, "远程录像")
|
||
$.each(playBallList, function (index, item) {
|
||
if (selectedScreen === item.selectedScreen) {
|
||
item.id = data.responseJSON.Param.ID;
|
||
}
|
||
});
|
||
} else {
|
||
layer.msg("抓拍成功", {icon: 1});
|
||
setTimeout("stopRemote(null,\"" + data.responseJSON.Param.ID + "\", 1,1);", 2000);
|
||
record(puid, document.title, "远程抓拍")
|
||
}
|
||
|
||
}
|
||
}
|
||
)
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
*
|
||
* @param puid
|
||
* @param id 流播放ID
|
||
* @param type
|
||
* @param typeBall
|
||
*/
|
||
function stopRemote(puid, id, type, typeBall) {
|
||
if (typeBall === 0) {
|
||
//创世
|
||
type = type === 0 ? "REALTIME" : "PICTURE";
|
||
$.ajax({
|
||
url: ctxPath + "/base/remote",
|
||
type: "POST",
|
||
data: {
|
||
puid: puid,
|
||
type: type,
|
||
action: "ManualStopPlateformStorage",
|
||
token: token
|
||
},
|
||
success: function (data) {
|
||
if (type === "REALTIME") {
|
||
layer.msg("停止录像成功", {icon: 1});
|
||
$.each(playBallList, function (index, item) {
|
||
if (selectedScreen === item.selectedScreen) {
|
||
item.id = null;
|
||
}
|
||
})
|
||
}
|
||
},
|
||
error: function (error) {
|
||
}
|
||
});
|
||
} else {
|
||
//清晰
|
||
let params = {
|
||
id: id
|
||
}
|
||
requestPost("CSS/C_CSS_StopManualStorage" + "?token=" + tokens, params, function (data) {
|
||
if (!isEmpty(data)) {
|
||
if (type === 0) {
|
||
layer.msg("停止录像成功", {icon: 1});
|
||
$.each(playBallList, function (index, item) {
|
||
if (selectedScreen === item.selectedScreen) {
|
||
item.id = null;
|
||
}
|
||
})
|
||
}
|
||
|
||
}
|
||
});
|
||
}
|
||
record(puid, document.title, "停止远程录像")
|
||
}
|
||
|
||
/**
|
||
* 云台操作
|
||
*/
|
||
function operate(ballType, puid, type) {
|
||
if (ballType === 0) {
|
||
csBallPTZ(puid, type);
|
||
} else {
|
||
switch (type) {
|
||
case "TurnUp":
|
||
qxBallPTZ('up', puid);
|
||
break;
|
||
case "TurnDown":
|
||
qxBallPTZ('down', puid);
|
||
break;
|
||
case "TurnLeft":
|
||
qxBallPTZ('left', puid);
|
||
break;
|
||
case "TurnRight":
|
||
qxBallPTZ('right', puid);
|
||
break;
|
||
case "AugmentAperture":
|
||
/* zoomcontrol('zoomin', puid);*/
|
||
break;
|
||
case "MinishAperture":
|
||
// zoomcontrol('zoominout', puid);
|
||
break;
|
||
case "ZoomInPicture":
|
||
zoomcontrol('zoomin', puid);
|
||
break;
|
||
case "ZoomOutPicture":
|
||
zoomcontrol('zoominout', puid);
|
||
break;
|
||
case "MakeFocusFar":
|
||
focuscontrol('faraway', puid);
|
||
break;
|
||
case "MakeFocusNear":
|
||
focuscontrol('near', puid);
|
||
break;
|
||
case "StopFocusMove":
|
||
focuscontrol('stop', puid);
|
||
break;
|
||
case "StopPictureZoom":
|
||
focuscontrol('stop', puid);
|
||
break;
|
||
default:
|
||
qxBallPTZ('stop', puid);
|
||
break;
|
||
}
|
||
}
|
||
switch (type) {
|
||
case "TurnUp":
|
||
record(puid, document.title, "球机移动(上)")
|
||
break;
|
||
case "TurnDown":
|
||
record(puid, document.title, "球机移动(下)")
|
||
break;
|
||
case "TurnLeft":
|
||
record(puid, document.title, "球机移动(左)")
|
||
break;
|
||
case "TurnRight":
|
||
record(puid, document.title, "球机移动(右)")
|
||
break;
|
||
case "ZoomInPicture":
|
||
record(puid, document.title, "球机操作(放大)")
|
||
break;
|
||
case "ZoomOutPicture":
|
||
record(puid, document.title, "球机操作(缩小)")
|
||
break;
|
||
case "MakeFocusFar":
|
||
record(puid, document.title, "球机操作(远焦)")
|
||
break;
|
||
case "MakeFocusNear":
|
||
record(puid, document.title, "球机操作(近焦)")
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 销毁断流方法
|
||
* @param flvPlayer
|
||
*/
|
||
function destoryVideo(flvPlayer) {
|
||
if (flvPlayer) {
|
||
flvPlayer.pause();
|
||
flvPlayer.unload();
|
||
flvPlayer.detachMediaElement();
|
||
flvPlayer.destroy();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 录制视频
|
||
*/
|
||
function recordVideo(id) {
|
||
let video = $("#" + id + "_video")[0];
|
||
let canvas = $("#canvas_" + id)[0];
|
||
let width = $(video).width();
|
||
let height = $(video).height();
|
||
let encodeType = "video/webm;codecs=vp8";
|
||
let chunks = [];
|
||
let frameId = null;
|
||
//设置画布背景
|
||
let ctx = canvas.getContext('2d');
|
||
let H = window.innerHeight;
|
||
let W = window.innerWidth;
|
||
const pixelRatio = window.devicePixelRatio || 1;
|
||
const backingStoreRatio = ctx.webkitBackingStorePixelRatio ||
|
||
ctx.mozBackingStorePixelRatio ||
|
||
ctx.msBackingStorePixelRatio ||
|
||
ctx.oBackingStorePixelRatio ||
|
||
ctx.backingStorePixelRatio || 1;
|
||
const ratio = pixelRatio / backingStoreRatio;
|
||
canvas.width = width * ratio;
|
||
canvas.height = height * ratio;
|
||
canvas.style.width = W + 'px';
|
||
canvas.style.height = H + 'px';
|
||
ctx.scale(ratio, ratio);
|
||
ctx.drawImage(video, 0, 0, width, height); // 将video中的数据绘制到canvas里
|
||
//创建MediaRecorder,设置媒体参数
|
||
let stream = canvas.captureStream();
|
||
let start = true;
|
||
let recorder = new MediaRecorder(stream, {
|
||
mimeType: encodeType
|
||
});
|
||
//收集录制数据
|
||
recorder.ondataavailable = e => {
|
||
chunks.push(e.data);
|
||
};
|
||
$('#localVideoBtn').click(function () {
|
||
if (playBallList.length === 0) {
|
||
layer.msg("请先播放视频", {icon: 2});
|
||
return;
|
||
}
|
||
if (selectedScreen !== $(video).closest("div").attr("id")) {
|
||
return;
|
||
}
|
||
if (start) {
|
||
layer.msg("开启本地录像", {icon: 0});
|
||
chunks = [];
|
||
recorder.start(10);
|
||
drawFrame();
|
||
$(this).css('background-image', 'url(../../img/video/no_check/local_video_no.png)')
|
||
start = false;
|
||
$.each(playBallList, function (index, item) {
|
||
if (item.selectedScreen === selectedScreen) {
|
||
item.recordVideo = start;
|
||
}
|
||
})
|
||
} else {
|
||
layer.msg("关闭本地录像", {icon: 0});
|
||
recorder.stop();
|
||
cancelAnimationFrame(frameId);
|
||
download();
|
||
$(this).css('background-image', 'url(../../img/video/no_check/local_video.png)')
|
||
start = true;
|
||
$.each(playBallList, function (index, item) {
|
||
if (item.selectedScreen === selectedScreen) {
|
||
item.recordVideo = start;
|
||
}
|
||
})
|
||
}
|
||
});
|
||
|
||
//播放视频
|
||
function drawFrame() {
|
||
ctx.drawImage(video, 0, 0, width, height);
|
||
frameId = requestAnimationFrame(drawFrame);
|
||
}
|
||
|
||
//下载录制内容
|
||
function download() {
|
||
let blob = new Blob(chunks, {type: 'video/webm'});
|
||
let url = window.URL.createObjectURL(blob);
|
||
let link = document.createElement("a");
|
||
link.href = url;
|
||
link.download = new Date().getTime() + ".mp4";
|
||
link.style.display = "none";
|
||
document.body.appendChild(link);
|
||
link.click();
|
||
link.remove();
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* 本地抓拍
|
||
*/
|
||
function screenshot(selectedScreen, type) {
|
||
let video = $("#" + selectedScreen + "_video")[0];
|
||
let canvas = $('#canvas_' + selectedScreen)[0];
|
||
let ctx = canvas.getContext('2d');
|
||
let H = window.innerHeight;
|
||
let W = window.innerWidth;
|
||
const pixelRatio = window.devicePixelRatio || 1;
|
||
const backingStoreRatio = ctx.webkitBackingStorePixelRatio ||
|
||
ctx.mozBackingStorePixelRatio ||
|
||
ctx.msBackingStorePixelRatio ||
|
||
ctx.oBackingStorePixelRatio ||
|
||
ctx.backingStorePixelRatio || 1;
|
||
const ratio = pixelRatio / backingStoreRatio;
|
||
canvas.width = $(video).width() * ratio;
|
||
canvas.height = $(video).height() * ratio;
|
||
canvas.style.width = W + 'px';
|
||
canvas.style.height = H + 'px';
|
||
ctx.scale(ratio, ratio);
|
||
ctx.drawImage(video, 0, 0, $(video).width(), $(video).height()); // 将video中的数据绘制到canvas里
|
||
let image = canvas.toDataURL('image/jpg').replace('image/jpg', 'image/octet-stream');
|
||
saveAs(image, new Date().getTime() + '.png' || new Date().getTime() + '.png');
|
||
}
|
||
|