| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757 |
- /*
- * 本文件仅供demo使用
- */
-
- let curLang = 'SimpChinese';
- //webpack中引用此代码块,格式不要随意改动
- //开发模式需要import,打包给3.0的变成了全局变量,不需要
-
- document.querySelector('#device_ipc_tab').addEventListener('click', (event) => {
- event.target.style.color = 'blue';
- document.querySelector('#device_ipc_content').style.display = '';
- ipcFunc();
- });
- document.querySelector('#onChangeLanguage').addEventListener('change', (event) => {
- let val = event.target.value;
- curLang = val;
- languageTrans();
- });
- const ipcFunc = () => {
- let $stream,
- $volume,
- $canvas, //canvas播放视频DOM
- $video, //video播放视频DOM
- $ivsCanvas,
- $detectCanvas,
- $drawCanvas, //canvas绘图DOM
- $video_wrap, //视频外层Wrap
- $videoLoading, //“加载中...”提示
- WndIndex = 0; //宫格窗口Id
- let channel = 0; //当前通道
- let curPage = 1; //视频下载列表的当前页
- let totalPage = 1; //视频下载列表的总页数
- let recordArr = []; //视频文件数组
- let canvasInstance = null; //canvas绘图实例
- let playerInstance = []; //预览实例数组
- let speedX = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];
- let recordInstance = []; //录像下载实例数组
- let talkInstance = []; //对讲实例数组
- let drawInstance = []; //canvas绘图实例数组
- let cutInstance = []; //视频裁剪实例数组
- let ivsInstance = []; //智能帧实例数组
- let positionInstance = []; //快读定位实例数组
- let isCuting = false; //是否正在进行视频裁剪
- let downList = []; //勾选的视频下载列表
- let downItemIndex = 0; //视频下载索引
- let canvasParam = { //canvas绘图默认传参
- 'strokeColor': '#FFFF00',
- 'title': '',
- 'resizeEnable': false,
- 'moveEnable': false,
- 'closeEnable': true,
- 'array': true,
- 'showSize': false,
- 'selectType': 'inSide',
- 'disappear': true,
- 'selected': true
- }
- 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 = {};
- let ChannelPTZCaps = [];
- /**
- * @description 初始化
- */
- const init = () => {
- let videoStr = '';
- for(let 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="500" height="300"></canvas>' + //智能帧的canvas
- '<canvas id="h5_detect_' + i + '" style="position: absolute;left: 0;top: 0;width: 100%;height: 100%;" width="500" height="300"></canvas>' + //智能区域的canvas
- '<canvas id="h5_draw_' + i + '" style="position: absolute;left: 0;top: 0;width: 100%;height: 100%;" width="500" height="300"></canvas>' + //绘制的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)';
- }
- });
- document.getElementById('currentTimes').innerText = speedX[WndIndex] + 'X';
- })
- });
- 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) {
- 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();
- }
- });
- _doc.querySelectorAll('.testButton').forEach(item => {
- item.addEventListener('click', async function(event) {
- // 阻止事件冒泡和默认行为
- event.stopPropagation();
- event.preventDefault();
- event.stopImmediatePropagation(); // 阻止同一元素上的其他监听器
-
- // 获取点击的li元素
- let liElement = event.target.parentNode;
- // 获取所有li元素列表
- let deviceDom = _doc.querySelectorAll('.h5-menu-list li');
- // 找到当前li在列表中的索引
- let deviceIndex = Array.from(deviceDom).indexOf(liElement);
-
- console.log('测试按钮被点击,设备索引:', deviceIndex); // 调试信息
-
- if(deviceIndex !== -1) {
- // 先登出当前窗口的设备
- await onLogout();
- // 设置当前设备索引
- curDeviceIndex = deviceIndex;
- // 登录并播放该设备
- onLogin();
- } else {
- alert('无法找到设备信息!');
- }
-
- return false; // 额外确保阻止默认行为
- }, true); // 使用捕获阶段,确保先处理
- });
- ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'msfullscreenchange'].forEach((item, index) => {
- document.addEventListener(item, fullscreenchange, false);
- });
- onChangeWdnNum();
- }
- /**
- * @description 切换宫格时重新设置当前视频dom
- */
- const setVideoDom = () => {
- $canvas = $('#h5_canvas_' + WndIndex);
- $video = $('#h5_video_' + WndIndex);
- $drawCanvas = $('#h5_draw_' + WndIndex);
- $videoLoading = $('#h5_loading_' + WndIndex);
- $ivsCanvas = $('#h5_ivs_' + WndIndex);
- $detectCanvas = $('#h5_detect_' + 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;
- let main, extra;
- main = new Option(tl('com.MainStream'), 0);
- main.setAttribute('t', 'com.MainStream');
- $stream.options.add(main);
- if (maxExtra > 1) {
- for(let i = 1; i <= maxExtra; i++) {
- extra = new Option(tl('com.ExtraStream') + i, i);
- extra.setAttribute('t', 'com.ExtraStream' + i);
- $stream.options.add(extra);
- }
- } else {
- extra = new Option(tl('com.ExtraStream'), 1);
- extra.setAttribute('t', 'com.ExtraStream');
- $stream.options.add(new Option(tl('com.ExtraStream'), 1));
- }
- // 默认使用子码流(如果存在),以降低分辨率和内存占用
- try {
- if ($stream && $stream.options && $stream.options.length > 1) {
- // 0 是主码流,从 1 开始为子码流
- $stream.value = '1';
- } else if ($stream && $stream.options && $stream.options.length > 0) {
- $stream.value = '0';
- }
- } catch (e) {
- console.warn('[DAHUA] set default stream failed:', e);
- }
- });
- 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));
- }
- });
- RPC.PTZManager('getCurrentProtocolCaps',channel).then(res => {
- ChannelPTZCaps[channel] = res?.caps;
- }).catch(err => {console.log(err);});
- 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_draw_' + 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 = tl('com.OpenFailed'); //打开失败!
- 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';
- }
- let 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,
- wndIndex: WndIndex,
- h265AccelerationEnabled: 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';
- $ivsCanvas.style.display = '';
- 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 = '';
- }
- canvasInstance = new PluginCanvasES6();
- let instance = new H5Canvas($ivsCanvas, $drawCanvas, $detectCanvas, WndIndex);
- canvasInstance.init($drawCanvas, function (data) {
- rebackActivateLocalEnlarging(data);
- });
- canvasInstance.addChangeShapeEvent();
- playerInstance[WndIndex] = player;
- drawInstance[WndIndex] = canvasInstance;
- ivsInstance[WndIndex] = instance;
- });
- 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.on('IvsDraw', function(data, index) {
- let ivsShow = $('#h5_ivs').value;
- let winID = index;
- if(ivsShow === '1') {
- ivsInstance[winID] && ivsInstance[winID].receiveDataFromStream(data, 0);
- } else {
- ivsInstance[winID] && ivsInstance[winID].close();
- }
- });
- player.init($canvas, $video);
- $videoLoading.style.display = '';
- $videoLoading.innerText = tl('com.Loading');
- }
- 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,
- wndIndex: WndIndex
- };
- player = new PlayerControl(options);
- player.on('UpdateCanvas', function (e) {
- let playbackIndex = player.playbackIndex;
- let _index = playbackIndex%16;
- if(firstTime === 0){
- firstTime = e.timestamp;//获取录像文件的第一帧的时间戳
- }
- $('#h5_curTime_'+ _index).innerText = e.timestamp - firstTime;
- });
- player.on('GetTotalTime', function (e) {
- let playbackIndex = player.playbackIndex;
- let _index = playbackIndex%16;
- $('#h5_totalTime_'+ _index).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';
- $ivsCanvas.style.display = '';
- });
- 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 = '';
- }
- canvasInstance = new PluginCanvasES6();
- let instance = new H5Canvas($ivsCanvas, $drawCanvas, $detectCanvas, WndIndex);
- canvasInstance.init($drawCanvas, function (data) {
- rebackActivateLocalEnlarging(data);
- });
- canvasInstance.addChangeShapeEvent();
- playerInstance[WndIndex] = player;
- drawInstance[WndIndex] = canvasInstance;
- ivsInstance[WndIndex] = instance;
- });
- 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('IvsDraw', function(data, index) {
- let ivsShow = $('#h5_ivs').value;
- let winID = index;
- if(ivsShow === '1') {
- ivsInstance[winID] && ivsInstance[winID].receiveDataFromStream(data, 0);
- } else {
- ivsInstance[winID] && ivsInstance[winID].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 = tl('com.Loading');
- }
- 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_draw_0').click();
- } else {
- _doc.querySelector('#h5_draw_' + (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].startRecord(false);
- recordInstance[WndIndex] = null;
- }
- $videoLoading.style.display = 'none';
- $ivsCanvas.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 ivsCanvas = $('#h5_ivs_' + i);
- let dom = canvasDom;
- if (dom.style.display === 'none') {
- dom = videoDom;
- }
- dom.style.display = 'none';
- ivsCanvas.style.display = 'none';
- }
- }
- talkInstance.forEach(item => {
- if(item) {
- item.talk('off');
- item = null;
- }
- });
- recordInstance.forEach(item => {
- if(item) {
- item.startRecord(false);
- item = null;
- }
- });
- _doc.querySelectorAll('[id^=h5_loading_]').forEach(item => {
- item.style.display = 'none';
- });
- }
- const startFastPostion = () => {
- onStopEnlarge();
- if(!positionInstance[WndIndex]) {
- positionInstance[WndIndex] = new PluginCanvasES6();
- positionInstance[WndIndex].init($drawCanvas, function (data) {
- fastPostionEvent(data);
- });
- positionInstance[WndIndex].addChangeShapeEvent();
- }
- positionInstance[WndIndex].setRegionNum('rect', 1);
- positionInstance[WndIndex].drawStart('rect', {...canvasParam});
- const fastPostionEvent = (data) => {
- let pos = data.data;
- let left = pos[0][0];
- let top = pos[0][1];
- let right = pos[1][0];
- let bottom = pos[1][1];
- let x = (right + left) / (2 * 8192),
- y = (bottom + top) / (2 * 8192);
- let maxlength = Math.abs(bottom - top) > Math.abs(right - left) ? (bottom - top) : (right - left);
- let zoomtemp = (maxlength / 8192);
- let zoom = (right - left) > 0 ? zoomtemp * zoomtemp : (-1) * zoomtemp * zoomtemp;
- let request = Promise.resolve();
- let useNewApi = ChannelPTZCaps?.[channel]?.MoveDirectly?.Type?.includes('Real');
- if(useNewApi) {
- request = RPC.PTZBase.moveDirectly({
- channel : channel,
- startPoint : [left,top],
- endPoint : [right, bottom]
- });
- }else{
- request = RPC.PTZManager('moveDirectly',channel,{screen:[x, y, zoom]});
- }
- request.then(() => {
- console.log('快读定位成功!')
- });
- }
- }
- const stopFastPostion = () => {
- if(positionInstance[WndIndex]) {
- positionInstance[WndIndex].removeShapeDrawEvent();
- positionInstance[WndIndex] = null;
- }
- }
- /**
- * @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].startRecord(false);
- recordInstance[WndIndex] = null;
- }
- $videoLoading.style.display = 'none';
- $ivsCanvas.style.display = 'none';
- deviceObject.session[curDeviceIndex] = 0;
- deviceObject.loginState[curDeviceIndex] = false;
- pubsub.publish('_clearTime_', WndIndex);
- curPage = 1;
- totalPage = 1;
- });
- }
- /**
- * @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 ivsCanvas = $('#h5_ivs_' + i);
- let dom = canvasDom;
- if (dom.style.display === 'none') {
- dom = videoDom;
- }
- dom.style.display = 'none';
- ivsCanvas.style.display = 'none';
- }
- }
- talkInstance.forEach(item => {
- if(item) {
- item.talk('off');
- item = null;
- }
- });
- recordInstance.forEach(item => {
- if(item) {
- item.startRecord(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');
- });
- }
- }
- curPage = 1;
- totalPage = 1;
- }
- /**
- * @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 slow
- */
- const onSlow = () => {
- if(speedX[WndIndex] == null){
- speedX[WndIndex] = 1;
- }
- if(speedX[WndIndex] < 0.125){
- return;
- }
- speedX[WndIndex] = speedX[WndIndex] / 2;
- document.getElementById('currentTimes').innerText = speedX[WndIndex] + 'X';
- playerInstance[WndIndex].playFF(speedX[WndIndex]);
- }
- /**
- * @description fast
- */
- const onFast = () => {
- if(speedX[WndIndex] == null){
- speedX[WndIndex] = 1;
- }
- if(speedX[WndIndex] > 8){
- return;
- }
- speedX[WndIndex] = speedX[WndIndex] * 2;
- document.getElementById('currentTimes').innerText = speedX[WndIndex] + 'X';
- playerInstance[WndIndex].playFF(speedX[WndIndex]);
- }
- /**
- * @description 抓图
- */
- const onSnap = () => {
- if(playerInstance[WndIndex]) {
- playerInstance[WndIndex].capture('test');
- }
- }
- /**
- * @description 获取抓图数据
- */
- const onGetCapture = () => {
- if(playerInstance[WndIndex]) {
- let picData = playerInstance[WndIndex].getCapture('jpg', 1.0); //参数释义:type(jpg/jpeg/png),quality(0-1.0)
- console.log(picData);
- }
- }
- /**
- * @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.startRecord(true, {
- nameOptions: {
- nameFormat: ['{fileName}_ymd_his', {
- fileName: 'testFileName'
- }]
- }
- });
- recordInstance[WndIndex] = recordPlayer;
- $videoLoading.style.display = '';
- $videoLoading.innerText = tl('com.Recording'); //录像中!
- }
- /**
- * @description 针对直播的,停止本地下载
- */
- const onStopRecord = () => {
- if(recordInstance[WndIndex]) {
- recordInstance[WndIndex].startRecord(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时间差值
- isDownLoad:true
- }
- 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 = () => {
- stopFastPostion();
- if (drawInstance[WndIndex]) {
- $ivsCanvas.style.display = 'none';
- drawInstance[WndIndex].setRegionNum('rect', 1);
- let param = {...canvasParam};
- drawInstance[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_draw_' + WndIndex).setAttribute('height', 300);
- _doc.querySelector('#h5_draw_' + WndIndex).setAttribute('width', 500);
- drawInstance[WndIndex] && drawInstance[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';
- $ivsCanvas.style.display = '';
- }
- /**
- * @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';
- drawInstance[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_draw_]');
- let divDom = _doc.querySelectorAll('.h5-play-wrap div');
- // 限制最大分屏为 2x2,避免开启过多解码实例导致内存溢出
- let rawGrid = parseInt(val, 10) || 1;
- let grid = Math.min(rawGrid, 2);
- if (rawGrid !== grid) {
- // 同步下拉框显示
- let sel = _doc.querySelector('[sel-for=onChangeWdnNum]');
- if (sel) {
- sel.value = String(grid);
- }
- }
- let total = grid * grid;
- // 控制显示数量
- divDom.forEach((item, index) => {
- if (index < total) {
- item.style.display = 'block';
- } else {
- item.style.display = 'none';
- }
- });
- // 设置尺寸
- if(grid === 1) {
- divDom.forEach((item, index) => {
- if(index < total) {
- item.style.width = '100%';
- item.style.height = '100%';
- item.style.borderColor = '#000';
- }
- });
- } else if(grid === 2) {
- divDom.forEach((item, index) => {
- if(index < total) {
- item.style.width = 'calc(50% - 2px)';
- item.style.height = 'calc(50% - 2px)';
- }
- });
- } else if(grid === 3) {
- divDom.forEach((item,index) => {
- if(index < total) {
- item.style.height = 'calc(33.333% - 2px)';
- item.style.width = 'calc(33.333% - 2px)';
- }
- });
- } else if(grid === 4) {
- divDom.forEach((item, index) => {
- if(index < total) {
- item.style.width = 'calc(25% - 2px)';
- item.style.height = 'calc(25% - 2px)';
- }
- });
- }
- // 调整canvas大小,仅对可见窗口
- ivsDom.forEach(item => {
- if (item.parentNode && item.parentNode.style.display !== 'none') {
- item.setAttribute('width', `${item.parentNode.clientWidth}`);
- item.setAttribute('height', `${item.parentNode.clientHeight}`);
- }
- });
- drawInstance.forEach((item, index) => {
- if (divDom[index] && divDom[index].style.display !== 'none') {
- item && item.resize();
- }
- });
- // 默认选中第一个窗口
- let first = _doc.querySelector('#h5_draw_0');
- first && first.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': 13 }).then(data => {
- if (Number.isInteger(data.found)) {
- recordNums = recordNums + data.found;
- allRecords = allRecords.concat([...data.infos]);
- if (data.found === 13) {
- 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 = 1;
- $('#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(tl('com.SDEncryptPlaybackTip')); //回放功能需要确保SD卡经过设备认证
- } else {
- let table = _doc.querySelector('#h5_table tbody');
- table.innerHTML = '';
- $('#h5_curPage').innerText = 1;
- $('#h5_totalPage').innerText = 1;
- alert(tl('com.NoData')); //无数据
- }
- });
- }
- /**
- * @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,
- isDownLoad: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 pageToIndex = (curPage - 1 ) * lINENUMBER;
- let _index = event.target.getAttribute('id').split('_')[2] - 0 + pageToIndex;
- 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);
- });
- });
- _doc.querySelectorAll('[id^=h5_button_go_]').forEach(item => {
- item.addEventListener('click', function(event) {
- event.stopPropagation();
- let id = item.getAttribute('id').split('_')[3] - 0;
- onGoTime(id);
- });
- });
- }
- /**
- * @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();
- }
- document.querySelector('#device_ipc_tab').click();
- /*
- * 加载翻译
- */
- const languageTrans = () => {
- fetch('./lang/' + curLang + '.txt')
- .then(res => {
- return res.json()
- }).then(text => {
- setLanguage(JSON.parse(JSON.stringify(text)));
- translation();
- });
- }
- languageTrans();
- window.onload = function() {
- if (!['http:', 'https:'].includes(window.location.protocol)) {
- confirm('请参考readme.txt,在https server中打开此页面');
- try {
- window.close();
- } catch (e) {
- alert('请手动关闭此标签页');
- }
- }
- };
|