Files
oms/front/static/fast/fast.js

1498 lines
56 KiB
JavaScript
Raw Normal View History

2026-03-10 18:45:36 +08:00
/*
* 本文件仅供demo使用
*/
//webpack中引用此代码块格式不要随意改动
//开发模式需要import,打包给3.0的变成了全局变量,不需要
function ipcFunc()
{
//document.write("<script language = javascript src = '../../../static/fast/module/PlayerControl.js'></script>");
let new_element = document.createElement("script");
new_element.setAttribute("type","text/javascript");
new_element.setAttribute("src", "./static/fast/module/PlayerControl.js");
document.body.appendChild(new_element);
let $stream,
$volume,
$canvas, //canvas播放视频DOM
$video, //video播放视频DOM
$canvas_ivs, //canvas绘图DOM
$video_wrap, //视频外层Wrap
$videoLoading, //“加载中...”提示
WndIndex = 0; //宫格窗口Id
let channel = 0; //当前通道
let curPage = 1; //视频下载列表的当前页
let totalPage = 1; //视频下载列表的总页数
let recordArr = []; //视频文件数组
let canvasSon = null; //canvas绘图实例
let playerInstance = []; //预览实例数组
let recordInstance = []; //录像下载实例数组
let talkInstance = []; //对讲实例数组
let ivsInstance = []; //canvas绘图实例数组
let cutInstance = []; //视频裁剪实例数组
let isCuting = false; //是否正在进行视频裁剪
let downList = []; //勾选的视频下载列表
let downItemIndex = 0; //视频下载索引
let canvasParam = { //canvas绘图默认传参
'strokeColor': '#FF0000',
'title': '',
'resizeEnable': false,
'moveEnable': false,
'closeEnable': true,
'array': true,
'showSize': false,
'selectType': 'inSide',
'disappear': true,
'selected': false
}
let curDeviceIndex = 0;
const lINENUMBER = 16; //回放列表每页显示录像条数
let deviceObject = {
loginState: [],
session: []
}
let isStartAll = false;
let curEnlargeWnd = 0;
let _doc = document.getElementById('device_ipc_content');
let playbackOptions = {};
/**
* @description 初始化
*/
const init = () => {
let videoStr = '';
for(var i = 0; i < 16; i++) {
videoStr += '<div wnd-index="' + i + '" style="float: left; background-color: #000; position: relative; width: 100%; height: 100%;overflow:hidden;border:1px solid rgb(125,125,125)"><canvas id="h5_canvas_' + i + '" style="width:100%;height:100%;"></canvas><p id="h5_loading_' + i + '" class="video_loading" style="display:none">加载中...</p><video id="h5_video_' + i + '" style="display: none;width:100%;height:100%;position:absolute;top:0;left:0"></video><canvas id="h5_ivs_' + i + '" style="position: absolute;left: 0;top: 0;width: 100%;height: 100%;" width="800" height="600"></canvas></div>';
}
_doc.querySelector('.h5-play-wrap').innerHTML = videoStr;
_doc.querySelectorAll('.h5-play-wrap div').forEach((item, index) => {
item.addEventListener('click', function(event) {
let _wndIndex = event.target.parentNode.getAttribute('wnd-index') - 0;
_doc.querySelectorAll('.h5-play-wrap div').forEach(function(item, index) {
if(index === _wndIndex) {
item.style.borderColor = 'rgb(255, 204, 0)';
WndIndex = _wndIndex;
curDeviceIndex = item.getAttribute('deviceindex') - 0;
setVideoDom();
} else {
item.style.borderColor = 'rgb(125, 125, 125)';
}
});
})
});
let deviceDom = _doc.querySelectorAll('.h5-menu-list li');
deviceObject.loginState = new Array(deviceDom.length).fill(false);
deviceObject.session = new Array(deviceDom.length).fill(0);
deviceDom.forEach(function(item, index) {
console.log("----------------"+index);
item.addEventListener('click', async () => {
await onLogout();
curDeviceIndex = index;
onLogin();
});
});
$stream = $('#h5_stream');
$volume = $('#h5_volume');
$video_wrap = _doc.querySelector('.h5-play-wrap');
setVideoDom();
let inputArr = _doc.querySelectorAll('input[btn-for]');
for(let node of inputArr) {
node.addEventListener('click', bindClickEvent);
}
let selArr = _doc.querySelectorAll('select[sel-for]');
for(let node of selArr) {
node.addEventListener('change', bindChangeEvent);
}
$volume.addEventListener('input', function(event) {
let vol = event.target.value - 0;
$('#h5_volume_value').innerText = vol;
});
$volume.addEventListener('change', function(event) {
let vol = event.target.value - 0;
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].setAudioVolume(vol);
}
});
$('#h5_first').addEventListener('click', function() {
if(curPage != 1) {
curPage = 1;
updateTable();
}
});
$('#h5_pre').addEventListener('click', function() {
if(curPage > 1) {
curPage = curPage - 1;
updateTable();
}
});
$('#h5_next').addEventListener('click', function() {
if(curPage < totalPage) {
curPage = curPage + 1;
updateTable();
}
});
$('#h5_last').addEventListener('click', function() {
if(curPage != totalPage) {
curPage = totalPage;
updateTable();
}
});
$('#h5_goPage').addEventListener('click', function() {
let val = $('#h5_goNumber').value - 0;
if(curPage != val) {
curPage = val;
updateTable();
}
});
['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'msfullscreenchange'].forEach((item, index) => {
document.addEventListener(item, fullscreenchange, false);
});
onChangeWdnNum();
}
/**
* @description 获取视频通道
*/
/**
* @description 切换宫格时重新设置当前视频dom
*/
const setVideoDom = () => {
$canvas = $('#h5_canvas_' + WndIndex);
$video = $('#h5_video_' + WndIndex);
$canvas_ivs = $('#h5_ivs_' + WndIndex);
$videoLoading = $('#h5_loading_' + WndIndex);
let _session = deviceObject.session[curDeviceIndex];
let _dom = _doc.querySelector('.h5-menu-list li:nth-child('+(curDeviceIndex+1)+')');
let ip = _dom.getAttribute('data-ip');
let port = _dom.getAttribute('data-port');
setIP(ip + ':' + port);
if(_session !== 0) {
_setSession(_session);
}
}
/**
* @description 登录之后调用获取设备能力获取通道码流
*/
const afterLogin = () => {
deviceObject.loginState[curDeviceIndex] = true;
deviceObject.session[curDeviceIndex] = _getSession();
$stream.options.length = 0;
$('#h5_playback_channel').options.length = 0;
$('#h5_channel').options.length = 0;
/**
* RPC.MagicBox.getProductDefinition 获取产品定义
* @param {string} 'MaxExtraStream' 定义名称
* @returns {Promise}
*/
RPC.MagicBox.getProductDefinition('MaxExtraStream').then(function(params) {
let maxExtra = params.definition;
$stream.options.add(new Option('主码流', 0));
if (maxExtra > 1) {
for(let i = 1; i <= maxExtra; i++) {
$stream.options.add(new Option('辅码流' + i, i));
}
} else {
$stream.options.add(new Option('辅码流', 1));
}
});
RPC.DevVideoInput.getCollect().then(function (params) {
let chnls = params.channels;
for(let i = 0; i < chnls;i++) {
$('#h5_playback_channel').options.add(new Option(i+1,i));
$('#h5_channel').options.add(new Option(i+1,i));
}
});
let curDate = new Date();
let dateString = curDate.toLocaleDateString();
let dateSplit = dateString.split('/');
let month = dateSplit[1] - 0;
if(month < 10) {
dateSplit[1] = '0' + month;
}
let day = dateSplit[2] - 0;
if(day < 10) {
dateSplit[2] = '0' + day;
}
let date = dateSplit.join('-');
$('#h5_startTime').value = date + 'T' + '00:00';
$('#h5_endTime').value = date + 'T' + '23:59:59';
}
const onStartAll = async () => {
await onLogoutAll()
curDeviceIndex = 0;
_doc.querySelector('#h5_ivs_' + curDeviceIndex).click();
isStartAll = true;
onLogin();
}
/**
* @description 登录
*/
const onLogin = () => {
let _dom = _doc.querySelector('.h5-menu-list li:nth-child('+(curDeviceIndex+1)+')');
let ip = _dom.getAttribute('data-ip');
let port = _dom.getAttribute('data-port');
let name = _dom.getAttribute('data-user');
let pswd = _dom.getAttribute('data-pswd');
let target = ip + ':' + port;
setIP(target);
RPC.login(name, pswd, false).then((res) => {
setCookie('DWebClientSessionID', '', -1);
setCookie('DhWebClientSessionID', '', -1);
/**
* RPC.keepAlive 保活
*/
RPC.keepAlive(300, 60000, _getSession(), target, WndIndex);
afterLogin();
onRealPreview(ip,port,name,pswd);//登录后拉流
}).catch((err) => {
console.log(err);
loginError(err);
$videoLoading.style.display = '';
$videoLoading.innerText = '打开失败!';
let curWndType = _doc.querySelector('[sel-for=onChangeWdnNum]').value - 0;
let _newDom = _doc.querySelector('.h5-menu-list li:nth-child(' + (curDeviceIndex + 2) + ')');
if(curWndType !== 1 && _newDom != null && isStartAll) {
clickNextWnd();
_newDom.click();
};
});
}
const onRealPreview = (ip,port,name,pswd) => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].stop();
playerInstance[WndIndex].close();
playerInstance[WndIndex] = null;
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
dom.style.display = 'none';
}
var player = null;
let curChannel = channel + 1; //无插件通道号从1开始
let stream = $stream.value - 0;
let options = {
wsURL: 'ws://'+ ip +':' + port + '/rtspoverwebsocket',
rtspURL: 'rtsp://'+ ip +':' + port + '/cam/realmonitor?channel=' + curChannel + '&subtype='+ stream +'&proto=Private3',
username: name,
password: pswd,
lessRateCanvas:true
};
player = new PlayerControl(options);
player.on('MSEResolutionChanged', function (e) {
console.log(e)
});
player.on('PlayStart', function (e) {
console.log(e);
$canvas.parentNode.setAttribute('deviceindex', curDeviceIndex);
$videoLoading.style.display = 'none';
let curWndType = _doc.querySelector('[sel-for=onChangeWdnNum]').value - 0;
let _newDom = _doc.querySelector('.h5-menu-list li:nth-child(' + (curDeviceIndex + 2) + ')');
let hasLoginNum = getLoginState();
if(curWndType !== 1 && _newDom != null && isStartAll && hasLoginNum < curWndType * curWndType) {
clickNextWnd();
_newDom.click();
} else {
isStartAll = false;
}
});
player.on('DecodeStart', function (e) {
console.log(e)
if(e.decodeMode === 'video'){
$canvas.style.display = 'none';
$video.style.display = '';
}else{
$video.style.display = 'none';
$canvas.style.display = '';
}
canvasSon = new PluginCanvasES6();
canvasSon.init($canvas_ivs, function (data) {
rebackActivateLocalEnlarging(data);
});
canvasSon.addChangeShapeEvent();
playerInstance[WndIndex] = player;
ivsInstance[WndIndex] = canvasSon;
});
player.on('GetFrameRate', function (e) {
console.log('GetFrameRate: ' + e)
});
player.on('FrameTypeChange', function (e) {
console.log('FrameTypeChange: ' + e)
});
player.on('Error', function (e) {
//console.log('Error: ' + JSON.stringify(e))
});
player.on('WorkerReady',function(){
player.connect();
});
player.init($canvas, $video);
$videoLoading.style.display = '';
$videoLoading.innerText = '加载中...';
}
const onPlayBack = (url, index) => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].stop();
playerInstance[WndIndex].close();
playerInstance[WndIndex] = null;
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
dom.style.display = 'none';
}
let ip = playbackOptions.ip;
let port = playbackOptions.port;
let name = playbackOptions.name;
let pswd = playbackOptions.pswd;
let player = null;
let firstTime = 0;
let options = {
wsURL: 'ws://'+ ip +':' + port + '/rtspoverwebsocket',
rtspURL: 'rtsp://'+ ip +':' + port + '/' + url,
username: name,
password: pswd,
lessRateCanvas:true,
playbackIndex: index
};
player = new PlayerControl(options);
player.on('UpdateCanvas', function (e) {
let playbackIndex = player.playbackIndex;
if(firstTime === 0){
firstTime = e.timestamp;//获取录像文件的第一帧的时间戳
}
$('#h5_curTime_'+ playbackIndex).innerText = e.timestamp - firstTime;
});
player.on('GetTotalTime', function (e) {
let playbackIndex = player.playbackIndex;
$('#h5_totalTime_'+ playbackIndex).innerText = e;
});
player.on('MSEResolutionChanged', function (e) {
console.log(e)
});
player.on('PlayStart', function (e) {
console.log(e);
$canvas.parentNode.setAttribute('deviceindex', curDeviceIndex);
$videoLoading.style.display = 'none';
});
player.on('DecodeStart', function (e) {
console.log(e)
if(e.decodeMode === 'video'){
$video.style.display = '';
$canvas.style.display = 'none';
}else{
$video.style.display = 'none';
$canvas.style.display = '';
}
canvasSon = new PluginCanvasES6();
canvasSon.init($canvas_ivs, function (data) {
rebackActivateLocalEnlarging(data);
});
canvasSon.addChangeShapeEvent();
playerInstance[WndIndex] = player;
ivsInstance[WndIndex] = canvasSon;
});
player.on('GetFrameRate', function (e) {
console.log('GetFrameRate: ' + e)
});
player.on('FrameTypeChange', function (e) {
console.log('FrameTypeChange: ' + e)
});
player.on('FileOver', function (e) {
player.close();
});
player.on('Error', function (e) {
//console.log('Error: ' + JSON.stringify(e))
});
player.on('WorkerReady',function(){
player.connect();
});
player.init($canvas, $video);
$videoLoading.style.display = '';
$videoLoading.innerText = '加载中...';
}
const getLoginState = () => {
let num = 0;
deviceObject.loginState.map(item => {
if(item === true) {
num++;
}
});
return num;
}
const clickNextWnd = () => {
let curWndType = _doc.querySelector('[sel-for=onChangeWdnNum]').value - 0;
if(curWndType === 2 && WndIndex === 3 || curWndType === 3 && WndIndex === 8 || curWndType === 4 && WndIndex === 15) {
// _doc.querySelector('#h5_ivs_0').click();
} else {
_doc.querySelector('#h5_ivs_' + (WndIndex + 1)).click();
}
}
/**
* @description 关闭拉流
*/
const onStopPreview = () => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].stop();
playerInstance[WndIndex].close();
playerInstance[WndIndex] = null;
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
dom.style.display = 'none';
}
if(talkInstance[WndIndex]) {
talkInstance[WndIndex].talk('off');
talkInstance[WndIndex] = null;
}
if(recordInstance[WndIndex]) {
recordInstance[WndIndex].startRecod(false);
recordInstance[WndIndex] = null;
}
$videoLoading.style.display = 'none';
}
const onStopAllPreview = () => {
for(let i = 0; i < playerInstance.length; i++) {
if(playerInstance[i]) {
playerInstance[i].stop();
playerInstance[i].close();
playerInstance[i] = null;
let canvasDom = $('#h5_canvas_' + i);
let videoDom = $('#h5_video_' + i);
let dom = canvasDom;
if (dom.style.display === 'none') {
dom = videoDom;
}
dom.style.display = 'none';
}
}
talkInstance.forEach(item => {
if(item) {
item.talk('off');
item = null;
}
});
recordInstance.forEach(item => {
if(item) {
item.startRecod(false);
item = null;
}
});
_doc.querySelectorAll('[id^=h5_loading_]').forEach(item => {
item.style.display = 'none';
});
}
/**
* @description 登出当前设备
*/
const onLogout = async () => {
let _realDevice = _doc.querySelector('div[wnd-index="'+WndIndex+'"]').getAttribute('deviceindex');
if(_realDevice === null) {
return;
}
let _session = deviceObject.session[curDeviceIndex];
if(_session === 0) {
return;
}
_setSession(_session);
await RPC.Global.logout().then(function() {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].stop();
playerInstance[WndIndex].close();
playerInstance[WndIndex] = null;
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
dom.style.display = 'none';
}
if(talkInstance[WndIndex]) {
talkInstance[WndIndex].talk('off');
talkInstance[WndIndex] = null;
}
if(cutInstance[WndIndex]) {
cutInstance[WndIndex].stop();
cutInstance[WndIndex].close();
cutInstance[WndIndex] = null;
}
if(recordInstance[WndIndex]) {
recordInstance[WndIndex].startRecod(false);
recordInstance[WndIndex] = null;
}
$videoLoading.style.display = 'none';
deviceObject.session[curDeviceIndex] = 0;
deviceObject.loginState[curDeviceIndex] = false;
pubsub.publish('_clearTime_', WndIndex);
});
}
/**
* @description 登出全部设备
*/
const onLogoutAll = async () => {
for(let i = 0; i < playerInstance.length; i++) {
if(playerInstance[i]) {
playerInstance[i].stop();
playerInstance[i].close();
playerInstance[i] = null;
let canvasDom = $('#h5_canvas_' + i);
let videoDom = $('#h5_video_' + i);
let dom = canvasDom;
if (dom.style.display === 'none') {
dom = videoDom;
}
dom.style.display = 'none';
}
}
talkInstance.forEach(item => {
if(item) {
item.talk('off');
item = null;
}
});
recordInstance.forEach(item => {
if(item) {
item.startRecod(false);
item = null;
}
});
_doc.querySelectorAll('[id^=h5_loading_]').forEach(item => {
item.style.display = 'none';
});
let len = deviceObject.session.length; //登出已经登录的全部设备
for (let i = 0; i < len; i++) {
if(deviceObject.session[i] != 0) {
let _dom = _doc.querySelector('.h5-menu-list li:nth-child('+(i+1)+')');
let ip = _dom.getAttribute('data-ip');
let port = _dom.getAttribute('data-port');
setIP(ip + ':' + port);
_setSession(deviceObject.session[i]);
await RPC.Global.logout().then(() => {
deviceObject.session[i] = 0;
deviceObject.loginState[i] = false;
_doc.querySelector('div[wnd-index="'+WndIndex+'"]').removeAttribute('deviceindex');
});
}
}
}
/**
* @description 切换码流
*/
const onChangeStream = () => {
let _dom = _doc.querySelector('.h5-menu-list li:nth-child('+(curDeviceIndex+1)+')');
let ip = _dom.getAttribute('data-ip');
let port = _dom.getAttribute('data-port');
let name = _dom.getAttribute('data-user');
let pswd = _dom.getAttribute('data-pswd');
onRealPreview(ip, port, name, pswd);
}
/**
* @description 切换通道
*/
const onChangeChannel = () => {
channel = $('#h5_channel').value - 0;
let _dom = _doc.querySelector('.h5-menu-list li:nth-child('+(curDeviceIndex+1)+')');
let ip = _dom.getAttribute('data-ip');
let port = _dom.getAttribute('data-port');
let name = _dom.getAttribute('data-user');
let pswd = _dom.getAttribute('data-pswd');
onRealPreview(ip, port, name, pswd);
}
/**
* @description 开启音频
*/
const onTurnOnSound = () => {
let vol = $volume.value - 0;
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].setAudioVolume(vol);
}
}
/**
* @description 关闭音频
*/
const onTurnSoundOff = () => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].setAudioVolume(0);
}
}
/**
* @description 开启对讲
*/
const onStartTalk = () => {
let _realDevice = _doc.querySelector('div[wnd-index="'+WndIndex+'"]').getAttribute('deviceindex');
if(_realDevice === null) {
return;
}
let talkPlayer = null;
let _dom = _doc.querySelector('.h5-menu-list li:nth-child(' + (curDeviceIndex + 1) + ')');
let curChannel = channel + 1; //无插件通道号从1开始
let ip = _dom.getAttribute('data-ip');
let port = Number(_dom.getAttribute('data-port'));
let username = _dom.getAttribute('data-user');
let password = _dom.getAttribute('data-pswd');
let rtspURL = 'rtsp://'+ ip +':' + port + '/cam/realmonitor?channel=' + curChannel + '&subtype=5&proto=Private3';
let optionsAudio = {
wsURL: 'ws://'+ ip +':' + port + '/rtspoverwebsocket',
rtspURL: rtspURL,
username: username,
password: password,
isTalkService: true
}
talkPlayer = new PlayerControl(optionsAudio);
talkPlayer.talk('on');
talkInstance[WndIndex] = talkPlayer;
}
/**
* @description 关闭对讲
*/
const onStopTalk = () => {
if(talkInstance[WndIndex]) {
talkInstance[WndIndex].talk('off');
talkInstance[WndIndex] = null;
}
}
/**
* @description 抓图
*/
const onSnap = () => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].capture('test');
}
}
/**
* @description 针对直播的开始本地下载
*/
const onStartRecord = () => {
let _realDevice = _doc.querySelector('div[wnd-index="'+WndIndex+'"]').getAttribute('deviceindex');
if(_realDevice === null) {
return;
}
let recordPlayer = null;
let _dom = _doc.querySelector('.h5-menu-list li:nth-child(' + (curDeviceIndex + 1) + ')');
let curChannel = channel + 1; //无插件通道号从1开始
let ip = _dom.getAttribute('data-ip');
let port = Number(_dom.getAttribute('data-port'));
let username = _dom.getAttribute('data-user');
let password = _dom.getAttribute('data-pswd');
let stream = $stream.value - 0;
let rtspURL = 'rtsp://'+ ip +':' + port + '/cam/realmonitor?channel=' + curChannel + '&subtype='+ stream +'&proto=Private3';
let optionsRecord = {
wsURL: 'ws://'+ ip +':' + port + '/rtspoverwebsocket',
rtspURL: rtspURL,
username: username,
password: password
}
recordPlayer = new PlayerControl(optionsRecord);
recordPlayer.startRecod(true);
recordInstance[WndIndex] = recordPlayer;
$videoLoading.style.display = '';
$videoLoading.innerText = '录像中!';
}
/**
* @description 针对直播的停止本地下载
*/
const onStopRecord = () => {
if(recordInstance[WndIndex]) {
recordInstance[WndIndex].startRecod(false);
recordInstance[WndIndex] = null;
$videoLoading.style.display = 'none';
}
}
/**
* @description 针对回放视频的视频裁剪
*/
const onStartCut = () => {
let _cutIndex = _doc.querySelector('[btn-for=onStartCut]').getAttribute('cutIndex') - 0;
let cutPlayer = null;
let ip = playbackOptions.ip;
let port = playbackOptions.port;
let username = playbackOptions.name;
let password = playbackOptions.pswd;
let url = recordArr[_cutIndex].FilePath;
let _rtspURL = 'rtsp://'+ ip +':' + port + '/' + url;
let cutStartTime = $('#h5_cutStartTime').value;
let s = new Date(cutStartTime.replace('T', ' ')).getTime();
let startTime = new Date(recordArr[_cutIndex].StartTime).getTime();
let range1 = (s - startTime)/1000;
let optionsRecord = {
wsURL: 'ws://'+ ip +':' + port + '/rtspoverwebsocket',
rtspURL: _rtspURL,
username: username,
password: password,
isPrivateProtocol: false, //是否私有协议默认false
realm: RPC.realm, //登录返回的设备Realm值
speed: 16, //倍速拉流16倍速
playback: true, //是否是回放
range: range1 //视频裁剪时间与视频的StartTime时间差值
}
cutPlayer = new PlayerControl(optionsRecord);
cutPlayer.on('WorkerReady',function(){
cutPlayer.connect();
});
cutPlayer.on('FileOver',function(){
console.log('File Over');
cutPlayer.startCut(false);
isCuting = false;
$('#h5_cut_process').innerText = '100%';
});
cutPlayer.on('UpdateTimeStamp', function (e) {
let cutStartTime1 = $('#h5_cutStartTime').value;
let cutEndTime1 = $('#h5_cutEndTime').value;
let s1 = new Date(cutStartTime1.replace('T', ' ')).getTime() / 1000;
let e1 = new Date(cutEndTime1.replace('T', ' ')).getTime() / 1000;
let process = parseInt((1 - (e1 - e.timestamp) / (e1 - s1)) * 100);
// console.log(new Date(e.timestamp * 1000));
$('#h5_cut_process').innerText = (process > 100 ? 100 : process) + '%';
if((e.timestamp >= s1) && !isCuting) {
cutPlayer.startCut(true);
isCuting = true;
}
if((e.timestamp >= e1 ) && isCuting) {
cutPlayer.startCut(false);
isCuting = false;
$('#h5_cut_process').innerText = '100%';
}
});
cutPlayer.init($canvas, $video);
cutInstance[WndIndex] = cutPlayer;
}
/**
* @description 开启电子放大
*/
const onStartEnlarge = () => {
if (ivsInstance[WndIndex]) {
ivsInstance[WndIndex].setRegionNum('rect', 1);
let param = {...canvasParam};
ivsInstance[WndIndex].drawStart('rect', param);
curEnlargeWnd = WndIndex;
}
}
/**
* @description 开启区域放大
*/
const onStartGridEnlarge = () => {
_doc.querySelectorAll('[wnd-index]').forEach((item, index) => {
if(index === WndIndex) {
_doc.querySelector('[wnd-index="' + WndIndex +'"]').style.width = '100%';
_doc.querySelector('[wnd-index="' + WndIndex +'"]').style.height = '100%';
_doc.querySelector('#h5_ivs_' + WndIndex).setAttribute('height', 300);
_doc.querySelector('#h5_ivs_' + WndIndex).setAttribute('width', 500);
ivsInstance[WndIndex] && ivsInstance[WndIndex].resize();
} else {
item.style.display = 'none';
}
});
}
/**
* @description 关闭区域放大
*/
const onCloseGridEnlarge = () => {
_doc.querySelectorAll('[wnd-index]').forEach((item, index) => {
item.style.display = '';
});
onChangeWdnNum();
}
/**
* @description 关闭电子放大
*/
const onStopEnlarge = () => {
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
dom.style.width = '100%';
dom.style.height = '100%';
dom.style.left = 0;
dom.style.top = 0;
dom.style.position = 'static';
}
/**
* @description 绘制电子放大后的回调函数
* @param {object} data 矩形框的坐标信息
*/
const rebackActivateLocalEnlarging = data => {
if(curEnlargeWnd != WndIndex) return;
let pos = data.data;
let newData;
if (pos[0][0] === pos[1][0]) {
// return false;
} else {
newData = {
left: pos[0][0],
top: pos[0][1],
right: pos[1][0],
bottom: pos[1][1]
}
}
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
// 倒着画
if (newData.right < newData.left) {
let tmp = newData.left;
newData.left = newData.right;
newData.right = tmp;
}
if (newData.bottom < newData.top) {
let tmp = newData.top;
newData.top = newData.bottom;
newData.bottom = tmp;
}
let scaleW = $video_wrap.childNodes[WndIndex].clientWidth / 8191;
let scaleH = $video_wrap.childNodes[WndIndex].clientHeight / 8191;
let result = zoomArea(newData.left * scaleW, newData.top * scaleH, newData.right * scaleW, newData.bottom * scaleH, $video_wrap.childNodes[WndIndex].clientWidth, $video_wrap.childNodes[WndIndex].clientHeight);
dom.style.width = result.width + 'px';
dom.style.height = result.height + 'px';
dom.style.left = result.left + 'px';
dom.style.top = result.top + 'px';
dom.style.position = 'absolute';
ivsInstance[WndIndex].removeShapeDrawEvent();
}
/**
* @description 设置全屏
*/
const onSetFull = () => {
if (getFull()) {
exitfullScreen();
} else {
setfullScreen();
}
}
/**
* @description 切换窗口分割
*/
const onChangeWdnNum = () => {
let val = _doc.querySelector('[sel-for=onChangeWdnNum]').value;
let ivsDom = _doc.querySelectorAll('[id^=h5_ivs_]');
let divDom = _doc.querySelectorAll('.h5-play-wrap div');
if(val === '1') {
divDom.forEach(item => {
item.style.width = '100%';
item.style.height = '100%';
item.style.borderColor = '#000';
});
} else if(val === '2' ) {
divDom.forEach((item, index) => {
item.style.width = 'calc(50% - 2px)';
item.style.height = 'calc(50% - 2px)';
});
} else if(val === '3') {
divDom.forEach((item,index) => {
item.style.height = 'calc(33.333% - 2px)';
item.style.width = 'calc(33.333% - 2px)';
});
} else if(val === '4') {
divDom.forEach((item, index) => {
item.style.width = 'calc(25% - 2px)';
item.style.height = 'calc(25% - 2px)';
});
}
ivsDom.forEach(item => {
item.setAttribute('width', `${item.parentNode.clientWidth}`);
item.setAttribute('height', `${item.parentNode.clientHeight}`);
});
ivsInstance.forEach(item => {
item && item.resize();
});
_doc.querySelector('#h5_ivs_0').click();
}
/**
* @description 自定义选择器
* @param {string} str dom元素
*/
function $(str) {
if(str.charAt(0) == '#') {
return document.getElementById(str.substring(1));
} else if(str.charAt(0) == '.') {
return _doc.getElementsByClassName(str.substring(1));
} else {
return _doc.getElementsByTagName(str);
}
}
/**
* @description 设置样式
* @param {object} obj dom元素
* @param {*} json css样式
*/
function setStyle (obj, json){
for(let i in json) {
obj.style[i] = json[i];
}
}
/**
* @description 绑定click事件
* @param {object} event event对象
*/
function bindClickEvent(event) {
let $el = event.target,
method = $el.getAttribute('btn-for'),
disabled = $el.getAttribute('disabled');
if(!disabled) {
eval(method + "()");
}
}
/**
* @description 绑定change事件
* @param {object} event event对象
*/
function bindChangeEvent(event) {
let $el = event.target,
method = $el.getAttribute('sel-for'),
disabled = $el.getAttribute('disabled');
if(!disabled) {
eval(method + "()");
}
}
/**
* @description 转换数据坐标
* @param {*} x1 左上角x坐标
* @param {*} y1 左上角y坐标
* @param {*} x2 右下角x坐标
* @param {*} y2 右下角y坐标
* @param {*} width 宫格宽
* @param {*} height 宫格高
*/
function zoomArea (x1, y1, x2, y2, width, height) {
// 小框区域的数据
let rectArea = {
width: x2 - x1,
height: y2 - y1,
centerX: (x1 + x2) / 2, // 圆心坐标
centerY: (y1 + y2) / 2
};
// 放大比例,控件放大倍数上限是20
let scale = Math.min(width / rectArea.width, height / rectArea.height, 20);
// 原始窗口信息
let sourceWin = {
width: width,
height: height,
centerX: width / 2,
centerY: height / 2
};
// 放大后的窗口区域
let bigWinArea = {
width: width * scale,
height: height * scale,
left: sourceWin.centerX - rectArea.centerX * scale,
top: sourceWin.centerY - rectArea.centerY * scale
};
// 数据矫正
if (bigWinArea.left > 0) {
bigWinArea.left = 0;
}
if (bigWinArea.left < sourceWin.width - bigWinArea.width) {
bigWinArea.left = sourceWin.width - bigWinArea.width;
}
if (bigWinArea.top > 0) {
bigWinArea.top = 0;
}
if (bigWinArea.top < sourceWin.height - bigWinArea.height) {
bigWinArea.top = sourceWin.height - bigWinArea.height;
}
return bigWinArea;
}
/**
* @description 获取全屏状态
*/
function getFull() {
return window.top.document.mozFullScreen || window.top.document.webkitIsFullScreen || window.top.document.msFullscreenElement;
}
/**
* @description 全屏状态改变的回调事件
*/
function fullscreenchange() {
if (getFull()) {
return;
} else {
exitfullScreen();
}
}
/**
* @description 设置全屏
*/
function setfullScreen() {
let docElm = window.top.document.documentElement;
if (docElm.requestFullScreen) {
docElm.requestFullScreen();
} else if (docElm.mozRequestFullScreen) {
docElm.mozRequestFullScreen();
} else if (docElm.webkitRequestFullScreen) {
docElm.webkitRequestFullScreen();
} else if (docElm.msRequestFullscreen) {
docElm.msRequestFullscreen();
}
handleFullscreen(true);
}
/**
* @description 退出全屏
*/
function exitfullScreen() {
let docElm = window.top.document.documentElement;
if (docElm.exitFullscreen) {
docElm.exitFullscreen();
} else if (docElm.mozCancelFullScreen) {
docElm.mozCancelFullScreen();
} else if (docElm.webkitCancelFullScreen) {
docElm.webkitCancelFullScreen();
} else if (docElm.msExitFullscreen) {
docElm.msExitFullscreen();
}
handleFullscreen(false);
}
/**
* @description 处理全屏开关时的窗口大小
* @param {boolean} bool 是否要全屏
*/
function handleFullscreen(bool) {
if (bool) {
let wrap = {
position: 'absolute',
left: 0,
top: 0,
width: window.screen.width + 'px',
height: window.screen.height + 'px',
overflow: 'visible'
}
setStyle($video_wrap, wrap);
} else {
let wrap = {
position: 'relative',
overflow: 'hidden',
width:'500px',
height: '300px',
}
setStyle($video_wrap, wrap);
}
}
/**
* @description 查询录像
*/
const onSearchRecord = async () => {
let allRecords = [];
let recordNums = 0;
let playChannel = $('#h5_playback_channel').value - 0;
let _dom = _doc.querySelector('.h5-menu-list li:nth-child('+(curDeviceIndex+1)+')');
let _ip = _dom.getAttribute('data-ip');
let _port = _dom.getAttribute('data-port');
let _name = _dom.getAttribute('data-user');
let _pswd = _dom.getAttribute('data-pswd');
playbackOptions = {
ip: _ip,
port: _port,
name: _name,
pswd: _pswd
}
const getMediaFile = (params) => {
return new Promise((resolve, reject) => {
/**
* RPC.MediaFileFind.instance 创建媒体文件查找实例
* @returns {Promise}
*/
RPC.MediaFileFind.instance().then(json => {
let queryId = json.result;
/**
* RPC.MediaFileFind.findFile 设置查找条件并判断是否存在文件
* @param {number} queryId 实例id
* @param {object} params condition参数
* @returns {Promise}
*/
RPC.MediaFileFind.findFile(queryId, params).then(() => {
findNextFile(queryId).then(() => {
resolve(true);
}).catch((err) => {
reject(err);
});
}).catch((err) => {
reject(err);
});
}).catch((err) => {
reject(err);
});
});
}
const findNextFile = (queryId) => {
return new Promise((resolve, reject) => {
/**
* RPC.MediaFileFind.findNextFile 在指定条件基础上查询文件信息
* @param {number} queryId 实例
* @param {object} 需要查找的数目
* @returns {Promise}
*/
RPC.MediaFileFind.findNextFile(queryId, { 'count': 100 }).then(data => {
if (Number.isInteger(data.found)) {
recordNums = recordNums + data.found;
allRecords = allRecords.concat([...data.infos]);
if (data.found === 100) {
findNextFile(queryId).then(() => {
resolve(true);
}).catch((err) => {
reject(err);
});
} else {
recordArr = [...allRecords];
updateInfos(recordArr.slice(0, lINENUMBER));
updatePages();
stopFind(queryId);
resolve(true);
}
} else {
stopFind(queryId);
resolve(true);
}
}).catch((err) => {
reject(err);
stopFind(queryId);
});
})
}
const stopFind = object => {
return new Promise((resolve, reject) => {
/**
* PC.MediaFileFind.close 结束查询
* @param {number} object 媒体文件查找实例ID
* @returns {Promise}
*/
RPC.MediaFileFind.close(object).then(() => {
/**
* PC.MediaFileFind.destroy 销毁媒体文件查找实例
* @param {number} object 媒体文件查找实例ID
*/
RPC.MediaFileFind.destroy(object);
resolve(true);
}).catch(() => {
reject();
}).finally(() => {
});
})
}
const updateInfos = (infos) => {
let table = _doc.querySelector('#h5_table tbody');
table.innerHTML = '';
for(let i = 0; i < infos.length; i++) {
let time = infos[i].StartTime + ' - ' + infos[i].EndTime; //<input type="button" class="h5-button" btn-for="onGoTime" value="GO!">
let size = Math.round(infos[i].Length / 1024);
let newRow = table.insertRow(-1);
newRow.innerHTML = `<td><input type="checkbox" id="h5_check_${i}"></td><td>${i+1}</td><td>${time}</td><td>${size}</td><td><span id="h5_curTime_${i}">--</span><span>/</span><span id="h5_totalTime_${i}">--</span><input type="text" id="h5_goTime_${i}" style="width: 50px;"><input type="button" class="h5-button" id="h5_button_go_${i}" value="GO!"></td>`;
}
_doc.querySelectorAll('[id^=h5_button_go_]').forEach(item => {
item.addEventListener('click', function(event) {
let id = item.getAttribute('id').split('_')[3] - 0;
onGoTime(id);
});
});
_doc.querySelectorAll('[id^=h5_check_]').forEach(function(item) {
item.addEventListener('click', function(event) {
event.stopPropagation();
if(event.target.checked) {
//渲染裁剪时间
let _index = event.target.getAttribute('id').split('_')[2] - 0;
let startTime = recordArr[_index].StartTime.split(' ').join('T');
let endTime = recordArr[_index].EndTime.split(' ').join('T');
if(startTime.split(':')[2] === '00') {
startTime = startTime.substr(0, startTime.length - 3);
}
if(endTime.split(':')[2] === '00') {
endTime = endTime.substr(0, endTime.length - 3);
}
$('#h5_cutStartTime').value = startTime;
$('#h5_cutEndTime').value = endTime;
_doc.querySelector('[btn-for=onStartCut]').setAttribute('cutIndex', _index);
}
});
});
_doc.querySelectorAll('#h5_table tbody tr').forEach(function(item) {
item.addEventListener('dblclick', function(event) {
event.stopPropagation();
if(event.target.nodeName === 'TD') {
let dom = event.target.parentNode.childNodes[1];
let value = dom.innerText - 1;
let url = recordArr[value].FilePath;
onPlayBack(url, value);
}
});
});
}
const updatePages = () => {
totalPage = Math.ceil(recordNums/lINENUMBER);
$('#h5_curPage').innerText = curPage;
$('#h5_totalPage').innerText = totalPage;
}
let tmpDir = [];
try {
/**
* RPC.getDeviceAllInfo 获取存储信息
* @param {string} 'getDeviceAllInfo' 方法名
* @return {Promise}
*/
tmpDir = await RPC.getDeviceAllInfo('getDeviceAllInfo');
} catch(e) {
console.log(e);
}
let dirs = null;
if (tmpDir.info && tmpDir.info.length > 1) {
dirs = 'All';
}else {
dirs = tmpDir.info && tmpDir.info[0] && tmpDir.info[0].Detail && tmpDir.info[0].Detail[0] && tmpDir.info[0].Detail[0].Path || '/mnt/sd';
}
let startTime = $('#h5_startTime').value.replace('T', ' ');
let endTime = $('#h5_endTime').value.replace('T', ' ');
if(startTime.split(' ')[1].split(':').length < 3) {
startTime = startTime + ':00';
}
if(endTime.split(' ')[1].split(':').length < 3) {
endTime = endTime + ':00';
}
let params = {
condition: {
Channel: playChannel,
Dirs: [dirs],
StartTime: startTime,
EndTime: endTime,
Flags: null,
Events: ['*'],
Types: ['dav']
}
};
getMediaFile(params).catch((err) => {
if (err && err.error && err.error.code === 285409409) {
alert('回放功能需要确保SD卡经过设备认证');
} else {
let table = _doc.querySelector('#h5_table tbody');
table.innerHTML = '';
$('#h5_curPage').innerText = 1;
$('#h5_totalPage').innerText = 1;
alert('无数据');
}
});
}
/**
* @description 勾选当前页的全部录像
*/
const onCheckAll = () => {
let dom = $('#h5_checkAll');
let ele = _doc.querySelectorAll('[id^=h5_check_]');
let domChecked = dom.checked;
ele.forEach((item, index) => {
item.checked = domChecked;
})
}
/**
* @description 下载录像
*/
const onDownload = async () => {
let ele = _doc.querySelectorAll('[id^=h5_check_]');
downList = [];
ele.forEach((item, index) => {
let _id = item.getAttribute('id').split('_')[2] - 0;
if(item.checked) {
recordArr[(curPage - 1) * lINENUMBER + _id].selfCheckIndex = _id;
downList.push(recordArr[(curPage - 1) * lINENUMBER + _id]);
}
});
downItemIndex = 0;
onStartDownload(downList[downItemIndex]);
}
/**
* @description 开始下载录像
* @param {object} item 录像信息
*/
const onStartDownload = (item) => {
let _cutIndex;
if(item) {
_cutIndex = item.selfCheckIndex;
}
let cutPlayer = null;
let _dom = _doc.querySelector('.h5-menu-list li:nth-child(' + (curDeviceIndex + 1) + ')');
let ip = _dom.getAttribute('data-ip');
let port = Number(_dom.getAttribute('data-port'));
let username = _dom.getAttribute('data-user');
let password = _dom.getAttribute('data-pswd');
let url = recordArr[_cutIndex].FilePath;
let _rtspURL = 'rtsp://'+ ip +':' + port + '/' + url;
let optionsRecord = {
wsURL: 'ws://'+ ip +':' + port + '/rtspoverwebsocket',
rtspURL: _rtspURL,
username: username,
password: password,
isPrivateProtocol: false,
realm: RPC.realm,
speed: 16,
playback: true
}
cutPlayer = new PlayerControl(optionsRecord);
cutPlayer.on('WorkerReady',function(){
cutPlayer.connect();
});
cutPlayer.on('FileOver',function(){
cutPlayer.startCut(false);
isCuting = false;
$('#h5_down_process').innerText = '100%';
downItemIndex++;
if(downList[downItemIndex]) {
onStartDownload(downList[downItemIndex]);
}
});
cutPlayer.on('UpdateTimeStamp', function (e) {
let s1 = new Date(item.StartTime).getTime()/1000;
let e1 = new Date(item.EndTime).getTime()/1000;
let process = parseInt((1 - (e1 - e.timestamp) / (e1 - s1)) * 100);
$('#h5_down_process').innerText = (process > 100 ? 100 : process) + '%';
if((e.timestamp >= s1) && !isCuting) {
cutPlayer.startCut(true);
isCuting = true;
}
if((e.timestamp >= e1 ) && isCuting) {
cutPlayer.startCut(false);
isCuting = false;
$('#h5_down_process').innerText = '100%';
downItemIndex++;
if(downList[downItemIndex]) {
onStartDownload(downList[downItemIndex]);
}
}
});
cutPlayer.init($canvas, $video);
cutInstance[WndIndex] = cutPlayer;
}
/**
* @description 更新录像列表当前页
*/
const updateTable = () => {
$('#h5_checkAll').checked = false;
$('#h5_curPage').innerText = curPage;
let table = _doc.querySelector('#h5_table tbody');
table.innerHTML = '';
let index = (curPage - 1 ) * lINENUMBER;
let infos = recordArr.slice(index, index + lINENUMBER);
for(let i = 0; i < infos.length; i++) {
let time = infos[i].StartTime + '-' + infos[i].EndTime;
let size = Math.round(infos[i].Length / 1024) + '(KB)';
let newRow = table.insertRow(-1);
newRow.innerHTML = `<td><input type="checkbox" id="h5_check_${i}"></td><td>${index + i+1}</td><td>${time}</td><td>${size}</td><td><span id="h5_curTime_${i}">--</span><span>/</span><span id="h5_totalTime_${i}">--</span><input type="text" id="h5_goTime_${i}" style="width: 50px;"><input type="button" class="h5-button" id="h5_button_go_${i}" value="GO!"></td>`;
}
_doc.querySelectorAll('[id^=h5_check_]').forEach(function(item) {
item.addEventListener('click', function(event) {
event.stopPropagation();
if(event.target.checked) {
//渲染裁剪时间
let _index = event.target.getAttribute('id').split('_')[2] - 0;
let startTime = recordArr[_index].StartTime;
let endTime = recordArr[_index].EndTime;
$('#h5_cutStartTime').value = startTime;
$('#h5_cutEndTime').value = endTime;
_doc.querySelector('[btn-for=onStartCut]').setAttribute('cutIndex', _index);
}
});
});
_doc.querySelectorAll('#h5_table tbody tr').forEach(function(item) {
item.addEventListener('dblclick', function(event) {
event.stopPropagation();
let dom = event.target.parentNode.childNodes[1];
let value = dom.innerText - 1;
let url = recordArr[value].FilePath;
onPlayBack(url, value);
});
});
}
/**
* @description 暂停回放
*/
const onPausePlayback = () => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].pause();
}
}
/**
* @description 继续回放
*/
const onContinuePlayback = () => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].play();
}
}
/**
* @description 停止回放
*/
const onClosePlayback = () => {
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].stop();
playerInstance[WndIndex].close();
playerInstance[WndIndex] = null;
let dom = $canvas;
if (dom.style.display === 'none') {
dom = $video;
}
dom.style.display = 'none';
}
}
/**
* @description 录像跳到指定时间
* @param 要跳转时间的录像的id
*/
const onGoTime = (id) => {
let curTime = $('#h5_goTime_'+id).value - 0;
if(playerInstance[WndIndex]) {
playerInstance[WndIndex].playByTime(curTime);
}
}
/**
* @description ptz云台事件
* @param {string} type 云台事件类型
* @param {boolean} isStop 是否停止相应事件
*/
window.onHandlePTZ = function(type, isStop) {
let _realDevice = _doc.querySelector('div[wnd-index="'+WndIndex+'"]').getAttribute('deviceindex');
if(_realDevice === null) {
return;
}
let _session = deviceObject.session[curDeviceIndex];
_setSession(_session);
let stepVal = $('#h5_ptz_step').value - 0;
let arg2 = 0;
let arg2Arr = ['LeftUp', 'RightUp', 'LeftDown', 'RightDown'];
let presetArr = ['GotoPreset','SetPreset', 'ClearPreset'];
let presetNum = $('#h5_preset').value - 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', channel, { 'code': type, 'arg1': presetNum, 'arg2': 0, 'arg3': 0 });
} else {
RPC.PTZManager('start', channel, { 'code': type, 'arg1': stepVal, 'arg2': arg2, 'arg3': 0 });
}
} else {
RPC.PTZManager('stop', channel, { 'code': type, 'arg1': stepVal, 'arg2': arg2, 'arg3': 0 });
}
};
//进入页面自动初始化
init();
}
export { //很关键
ipcFunc
}