463 lines
9.7 KiB
JavaScript
463 lines
9.7 KiB
JavaScript
|
|
/**
|
||
|
|
* @Author: zhangtq 2452618307@qq.com
|
||
|
|
* @Date: 2024-11-18 13:33:30
|
||
|
|
* @LastEditors: zhangtq 2452618307@qq.com
|
||
|
|
* @LastEditTime: 2024-11-18 13:34:43
|
||
|
|
* @FilePath: static/js/qx/utility/video.js
|
||
|
|
* @Description: 这是默认设置,可以在设置》工具》File Description中进行配置
|
||
|
|
*/
|
||
|
|
var selectedScreen = "cs_ball";
|
||
|
|
var loginName="admin";
|
||
|
|
var password="bonus@admin";
|
||
|
|
var win;
|
||
|
|
var puid;
|
||
|
|
var webSocket;
|
||
|
|
var ballType;
|
||
|
|
var tokens;
|
||
|
|
var flvPlayer;
|
||
|
|
var loginToken;
|
||
|
|
var orgId;
|
||
|
|
|
||
|
|
$(function() {
|
||
|
|
orgId = localStorage.getItem("orgId");
|
||
|
|
setInterval(initLoginToken, 2000);
|
||
|
|
getRoleTreeData();
|
||
|
|
getWebSocket();
|
||
|
|
createVideo();
|
||
|
|
connect();
|
||
|
|
})
|
||
|
|
|
||
|
|
function initLoginToken() {
|
||
|
|
loginToken = localStorage.getItem("loginToken");
|
||
|
|
// var data = JSON.parse(window.localStorage.getItem("loginToken"));
|
||
|
|
// if (data !== null) {
|
||
|
|
// if (data.expirse != null && data.expirse < new Date().getTime()) {
|
||
|
|
// window.localStorage.removeItem("loginToken")
|
||
|
|
// loginToken = null;
|
||
|
|
// } else {
|
||
|
|
// loginToken = data.value;
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
if(loginToken=="" || loginToken==null){
|
||
|
|
// window.location.href = "http://localhost:63344/SbdVideoDisplayWeb/login.html?_ijt=1nni8n80o9n3ri1ugce6m1gcv9";
|
||
|
|
window.location.href = "http://112.31.212.128:21027/sbdVideo/login.html";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//树的设置
|
||
|
|
var setting1 = {
|
||
|
|
view: {
|
||
|
|
selectedMulti: true,
|
||
|
|
// showIcon:false
|
||
|
|
},
|
||
|
|
data: {
|
||
|
|
simpleData: {
|
||
|
|
enable: true
|
||
|
|
}
|
||
|
|
},
|
||
|
|
edit: {
|
||
|
|
enable: false,
|
||
|
|
},
|
||
|
|
callback: {
|
||
|
|
onClick: onTreeClick,
|
||
|
|
// 点击前
|
||
|
|
beforeClick: beforeClick,
|
||
|
|
// 不允许拖拽
|
||
|
|
beforeDrag: beforeDrag,
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
function beforeClick(treeId, treeNode) {
|
||
|
|
if (treeNode.id == 0) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
//不允许拖拽
|
||
|
|
function beforeDrag(treeId, treeNodes) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
//定义树节点初始数据
|
||
|
|
var zNodes1 = []; // 球机
|
||
|
|
//获取球机视频/移动视频树
|
||
|
|
function getRoleTreeData() {
|
||
|
|
var dialog = showDialog();
|
||
|
|
var url = "http://112.31.212.128:21028/ahsbs/video/getVideoTree";
|
||
|
|
$.ajax({
|
||
|
|
type: 'POST',
|
||
|
|
url: url,
|
||
|
|
data:{
|
||
|
|
orgId:orgId
|
||
|
|
},
|
||
|
|
dataType: "json",
|
||
|
|
success: function(data) {
|
||
|
|
var l = data.obj;
|
||
|
|
if (l == null) {
|
||
|
|
layer.alert("暂无球机视频");
|
||
|
|
layer.close(dialog);
|
||
|
|
} else {
|
||
|
|
var data = parseTreeData(l);
|
||
|
|
var nodes = zNodes1.concat(data);
|
||
|
|
$.fn.zTree.init($("#ballTree"), setting1, nodes);
|
||
|
|
layer.close(dialog);
|
||
|
|
}
|
||
|
|
},
|
||
|
|
error: function(e) {
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function showDialog() {
|
||
|
|
var layerMsg = layer.load(1,{
|
||
|
|
icon : 2,
|
||
|
|
shade : [0.5,'transparent']
|
||
|
|
});
|
||
|
|
return layerMsg;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 解析球机视频/移动视频树
|
||
|
|
function parseTreeData(data) {
|
||
|
|
for (var i = 0; i < data.length; i++) {
|
||
|
|
var type = data[i].platformType;
|
||
|
|
var pId = data[i].pid;
|
||
|
|
var puid = data[i].puid;
|
||
|
|
data[i].pId = pId;
|
||
|
|
data[i].open = true;
|
||
|
|
if (pId == '-1') {
|
||
|
|
data[i].icon = "../img/company.png";
|
||
|
|
} else if (pId != '-1' && puid == null){
|
||
|
|
data[i].icon = "../img/pro.png";
|
||
|
|
} else if (puid != null) {
|
||
|
|
var onLine = data[i].isOnline;
|
||
|
|
if(onLine == '1'){
|
||
|
|
data[i].icon = "../img/ball.png";
|
||
|
|
// if(type == "1"){
|
||
|
|
// data[i].icon = "../img/cs_ball.png";
|
||
|
|
// }else{
|
||
|
|
// data[i].icon = "../img/qx_ball.png";
|
||
|
|
// }
|
||
|
|
}else{
|
||
|
|
data[i].icon = "../img/no_online_ball.png";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return data;
|
||
|
|
}
|
||
|
|
|
||
|
|
//获取树点击事件 执行播放视频
|
||
|
|
function onTreeClick(event, treeId, treeNode, clickFlag) {
|
||
|
|
var cs_ball = document.getElementById('cs_ball');
|
||
|
|
var qx_ball = document.getElementById('qx_ball');
|
||
|
|
var width = window.screen.availWidth;
|
||
|
|
var height = window.screen.availHeight;
|
||
|
|
puid = treeNode.puid;
|
||
|
|
ballType = treeNode.platformType;
|
||
|
|
var onLine = treeNode.isOnline;
|
||
|
|
if(onLine == "1"){
|
||
|
|
var dialog = showDialog();
|
||
|
|
if(ballType == "1"){
|
||
|
|
cs_ball.style.display = "";
|
||
|
|
qx_ball.style.display = "none";
|
||
|
|
stopVideo(puid);
|
||
|
|
play(win,puid,"0",webSocket,dialog);
|
||
|
|
}else{
|
||
|
|
if (tokens != null) {
|
||
|
|
cs_ball.style.display = "none";
|
||
|
|
qx_ball.style.display = "";
|
||
|
|
stopVideo(puid);
|
||
|
|
playVideo(puid, "0",dialog);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}else{
|
||
|
|
layer.alert("请选择开机的球机")
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
function stopVideo(puid) {
|
||
|
|
if(win != null){
|
||
|
|
win.CloseVideo();
|
||
|
|
}
|
||
|
|
if(flvPlayer != null){
|
||
|
|
flvPlayer.unload();
|
||
|
|
flvPlayer.detachMediaElement();
|
||
|
|
flvPlayer.destroy();
|
||
|
|
flvPlayer = null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取websocket地址
|
||
|
|
*/
|
||
|
|
function getWebSocket(){
|
||
|
|
$.ajax({
|
||
|
|
url: "http://112.31.212.128:21028/ahsbs/video/getWebSocket",
|
||
|
|
type:"POST",
|
||
|
|
data:{name:loginName,passwd:password},
|
||
|
|
success:function(data){
|
||
|
|
var jsons = JSON.parse(data);
|
||
|
|
webSocket = jsons.content.Addr;
|
||
|
|
if(webSocket.indexOf("127.0.0.1") != -1){
|
||
|
|
webSocket = webSocket.replace("127.0.0.1","112.30.98.105");
|
||
|
|
}
|
||
|
|
win = new H5Live.Window(selectedScreen,{
|
||
|
|
callback: function (action, instance, data) {
|
||
|
|
}
|
||
|
|
});
|
||
|
|
},error:function(error){
|
||
|
|
alert("a")
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 创世h5视频播放
|
||
|
|
* @param win
|
||
|
|
* @param puid
|
||
|
|
* @param idx
|
||
|
|
* @param webSocket
|
||
|
|
*/
|
||
|
|
function play(win,puid,idx,webSocket,dialog) {
|
||
|
|
var options = {
|
||
|
|
wsPath: webSocket,
|
||
|
|
puid:puid,
|
||
|
|
idx:idx,
|
||
|
|
streamType:'REALTIME'
|
||
|
|
}
|
||
|
|
win.OpenVideo(options);
|
||
|
|
layer.close(dialog);
|
||
|
|
}
|
||
|
|
|
||
|
|
function ptz(type) {
|
||
|
|
if(ballType == "1"){
|
||
|
|
csBallPTZ(type);
|
||
|
|
}else{
|
||
|
|
if(type == 'TurnUp'){
|
||
|
|
qxBallPTZ('up');
|
||
|
|
}else if(type == 'TurnDown'){
|
||
|
|
qxBallPTZ('down');
|
||
|
|
}else if(type == 'TurnLeft'){
|
||
|
|
qxBallPTZ('left');
|
||
|
|
}else if(type == 'TurnRight'){
|
||
|
|
qxBallPTZ('right');
|
||
|
|
}else if(type == 'ZoomInPicture'){
|
||
|
|
zoomcontrol('zoomin');
|
||
|
|
}else if(type == 'ZoomOutPicture'){
|
||
|
|
zoomcontrol('zoominout');
|
||
|
|
}else if(type == 'MakeFocusFar'){
|
||
|
|
focuscontrol('faraway');
|
||
|
|
}else if(type == 'MakeFocusNear'){
|
||
|
|
focuscontrol('near');
|
||
|
|
}else if(type == 'StopFocusMove'){
|
||
|
|
focuscontrol('stop');
|
||
|
|
}else if(type == 'StopPictureZoom'){
|
||
|
|
zoomcontrol('stop');
|
||
|
|
}else{
|
||
|
|
qxBallPTZ('stop');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 创世云台控制
|
||
|
|
* @param {Object} type
|
||
|
|
*/
|
||
|
|
function csBallPTZ(type){
|
||
|
|
$.ajax({
|
||
|
|
url: "http://112.31.212.128:21028/ahsbs/video/getBallPTZControl",
|
||
|
|
type: "POST",
|
||
|
|
data: {
|
||
|
|
puid: puid,
|
||
|
|
type: type
|
||
|
|
},
|
||
|
|
success: function(data) {
|
||
|
|
console.log(new Date().getTime()+"云台控制:",data);
|
||
|
|
},
|
||
|
|
error: function(error) {
|
||
|
|
console.log("请求错误:",error);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 清新云台控制
|
||
|
|
* @param {Object} type
|
||
|
|
*/
|
||
|
|
function qxBallPTZ(type){
|
||
|
|
turncontrol(type).then(r => {});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 创建平台连接
|
||
|
|
*/
|
||
|
|
function connect() {
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function progress(e) {
|
||
|
|
var bf = e.srcElement.buffered;
|
||
|
|
var currentTime = e.srcElement.currentTime;
|
||
|
|
if (bf.length > 0) {
|
||
|
|
let end = bf.end(0);
|
||
|
|
if (end - currentTime > 1.5) {
|
||
|
|
e.srcElement.currentTime = end - 0.1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 播放视频
|
||
|
|
* @param puId
|
||
|
|
* @param idx
|
||
|
|
*/
|
||
|
|
function playVideo(puId, idx, dialog) {
|
||
|
|
//播视频接口
|
||
|
|
let url = _cf.q2http_url + "stream.flv?puid=" + puId + "&idx=" + idx + "&stream=0&token=" + tokens;
|
||
|
|
if (flvjs.isSupported()) {
|
||
|
|
let videoElement = document.getElementById('qx_ball_html5_api');
|
||
|
|
videoElement.controls = false;
|
||
|
|
flvPlayer = flvjs.createPlayer({
|
||
|
|
type: 'flv',
|
||
|
|
url: url,
|
||
|
|
isLive: true,
|
||
|
|
hasAudio: false
|
||
|
|
}, {
|
||
|
|
enableWorker: false,
|
||
|
|
autoCleanupSourceBuffer: true, //清理缓冲区
|
||
|
|
enableStashBuffer: false,
|
||
|
|
stashInitialSize: 128, // 减少首桢显示等待时长
|
||
|
|
statisticsInfoReportInterval: 600
|
||
|
|
});
|
||
|
|
flvPlayer.attachMediaElement(videoElement);
|
||
|
|
flvPlayer.load();
|
||
|
|
layer.close(dialog);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 清新
|
||
|
|
*/
|
||
|
|
function createVideo() {
|
||
|
|
let play = videojs('qx_ball', {
|
||
|
|
muted: true,
|
||
|
|
controls: false,
|
||
|
|
loop: true,
|
||
|
|
preload: "auto",
|
||
|
|
autoplay: true,
|
||
|
|
});
|
||
|
|
play.play();
|
||
|
|
$('#video_html5_api').width(document.body.clientWidth - 30);
|
||
|
|
$('#video_html5_api').height(document.body.clientHeight * 0.3 + 12)
|
||
|
|
$('#video_html5_api').css("background-color","black");
|
||
|
|
$('.vjs-loading-spinner').hide();
|
||
|
|
$('.vjs-big-play-button').hide();
|
||
|
|
$('.vjs-poster').removeAttr("class");
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
//缩放功能
|
||
|
|
function zoomcontrol(option) {
|
||
|
|
let params = {
|
||
|
|
puid: puid,
|
||
|
|
idx: "0"
|
||
|
|
}
|
||
|
|
switch (option) {
|
||
|
|
case "stop":
|
||
|
|
//停止缩放接口
|
||
|
|
requestPost('PTZ/C_PTZ_StopPictureZoom?token=' + tokens, params, rv => {
|
||
|
|
})
|
||
|
|
break;
|
||
|
|
case "zoomin":
|
||
|
|
//放大图像接口
|
||
|
|
requestPost('PTZ/C_PTZ_ZoomInPicture?token=' + tokens, params, rv => {
|
||
|
|
})
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
//缩小图像接口
|
||
|
|
requestPost('PTZ/C_PTZ_ZoomOutPicture?token=' + tokens, params, rv => {
|
||
|
|
})
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//远近焦点功能
|
||
|
|
function focuscontrol(option) {
|
||
|
|
let params = {
|
||
|
|
puid: puId,
|
||
|
|
idx: "0"
|
||
|
|
}
|
||
|
|
switch (option) {
|
||
|
|
case "near":
|
||
|
|
requestPost('PTZ/C_PTZ_MakeFocusNear?token=' + tokens, params, rv => {
|
||
|
|
console.log(rv)
|
||
|
|
})
|
||
|
|
break;
|
||
|
|
case "faraway":
|
||
|
|
requestPost('PTZ/C_PTZ_MakeFocusFar?token=' + tokens, params, rv => {
|
||
|
|
console.log(rv)
|
||
|
|
})
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
requestPost('PTZ/C_PTZ_StopFocusMove?token=' + tokens, params, rv => {
|
||
|
|
console.log(rv)
|
||
|
|
})
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//旋转平台功能
|
||
|
|
async function turncontrol(option) {
|
||
|
|
let params = {
|
||
|
|
puid: puid,
|
||
|
|
idx: "0",
|
||
|
|
motion: option
|
||
|
|
};
|
||
|
|
if (option != null) {
|
||
|
|
requestPost('PTZ/C_PTZ_Turn?token=' + tokens, params, (rv) => {
|
||
|
|
console.log(option);
|
||
|
|
console.log(rv);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|