From a3f357e8a60443b74b64c7479113c68eb35ce1f5 Mon Sep 17 00:00:00 2001 From: ZZJ <10913410+zzj2100@user.noreply.gitee.com> Date: 星期五, 15 七月 2022 19:44:57 +0800 Subject: [PATCH] 控制轮询 --- src/components/wasmPlayer/index.vue | 482 +++++++++++++++++++++++++++------------------------- 1 files changed, 249 insertions(+), 233 deletions(-) diff --git a/src/components/wasmPlayer/index.vue b/src/components/wasmPlayer/index.vue index becc42e..aab90e2 100644 --- a/src/components/wasmPlayer/index.vue +++ b/src/components/wasmPlayer/index.vue @@ -13,18 +13,20 @@ v-loading="videoLoading" element-loading-background="rgba(0, 0, 0, 0.8)" style="position: unset !important" - ></div> - <canvas + ></div> + <canvas ref="playCanvas" id="paly-canvas" width="960" height="540" ></canvas> </div> - - <transition name="fade"> - <div class="popuptext" id="myPopup" v-if="fullScreenNotice">璧勬簮涓嬭浇涓�,璇风◢鍚�...</div> - </transition> + + <transition name="fade"> + <div class="popuptext" id="myPopup" v-if="fullScreenNotice"> + 璧勬簮涓嬭浇涓�,璇风◢鍚�... + </div> + </transition> <!-- 鎺у埗鏉� --> <section @@ -55,7 +57,7 @@ </div> <!-- 澹伴煶 --> - <b class="jsmodern-video-volume"></b> + <!-- <b class="jsmodern-video-volume"></b> --> <!-- <div class="jsmodern-video-volumebox"> <div class="jsmodern-video-volumeline"></div> <b class="jsmodern-video-volumedot"></b> @@ -70,8 +72,9 @@ <!-- 涓嬭浇 --> <i - class="el-icon-download jsmodern-video-download" - @click="downLoad" + class="el-icon-download jsmodern-video-download" + @click="downLoad" + v-show="!isStream" ></i> </section> @@ -93,7 +96,7 @@ <!-- 鎾斁澶辫触 --> <span class="video-error" v-show="playerStatus == -1"> - <i class="el-icon-warning-outline" style="font-size:40px"></i> + <i class="el-icon-warning-outline" style="font-size: 40px"></i> <br /> 瑙嗛鍔犺浇澶辫触 鏃犳晥鐨勮棰戝湴鍧� </span> @@ -106,31 +109,31 @@ /* 2021.09.22 娣诲姞澶氫釜褰曞儚鍦板潃鐨勫鐞�, 涓庡綍鍍忔ā鍧楃害瀹�, 鐢� || 鍒嗗壊澶氫釜瑙嗛鍦板潃, 鍓嶇澶勭悊鎾斁. */ -import { Player } from './wasm/player' -import VideoRuleData from '@/Pool/VideoRuleData' -import { getAllPolygon } from '@/api/polygon' +import { Player } from "./wasm/player"; +import VideoRuleData from "@/Pool/VideoRuleData"; +import { getAllPolygon } from "@/api/polygon"; export default { - name: 'CameraPlayer', + name: "CameraPlayer", props: { videoUrl: { type: String, // default: "ws://192.168.1.182:10101/ws" - default: `${location.protocol === 'https' ? 'wss' : 'ws'}://${ + default: `${location.protocol === "https" ? "wss" : "ws"}://${ location.host }/ws`, }, cameraName: { type: String, - default: '', + default: "", }, cameraID: { type: String, - default: 'C4668FD0-3CAE-C31F-C21E-28B7001243C4', + default: "C4668FD0-3CAE-C31F-C21E-28B7001243C4", }, rtspUrl: { type: String, default: - 'rtsp://admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream', + "rtsp://admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream", }, isRunning: { type: Boolean, @@ -160,20 +163,20 @@ computed: { poster() { - return '/images/player/player_poster.gif?t=' + Math.random() + return "/images/player/player_poster.gif?t=" + Math.random(); }, showPrev() { - return this.playerIndex - 1 >= 0 + return this.playerIndex - 1 >= 0; }, showNext() { - return this.playerIndex + 1 < this.videoUrls.length + return this.playerIndex + 1 < this.videoUrls.length; }, }, data() { return { player: null, playerId: 0, - Camera: new VideoRuleData(), + Camera: new VideoRuleData(this.isGb), showCanvas: true, canvasData: { line: [], @@ -197,102 +200,113 @@ playerIndex: 0, isEmptyUrl: false, videoLoading: false, - loadUrl:'', - isFullScreen:false, - fullScreenNotice:false - } + loadUrl: "", + isFullScreen: false, + fullScreenNotice: false, + }; }, watch: { - rtspUrl: function(newVal, oldVal) { + rtspUrl: function (newVal, oldVal) { if (newVal !== oldVal) { if (this.player) { - this.player.stop() - !!this.algoDataSocket && this.algoDataSocket.close() + this.player.stop(); + !!this.algoDataSocket && this.algoDataSocket.close(); } this.$nextTick(() => { - this.playVideo() - }) + this.playVideo(); + }); + } + }, + videoUrl: function (newVal, oldVal) { + if (newVal !== oldVal) { + if (this.player) { + this.player.stop(); + } + this.$nextTick(() => { + this.player.preloadFlag = 0; + this.playVideo(); + }); } }, }, mounted() { - this.player = new Player() - this.player.preload = this.preload - this.player.statusCallback = this.setPlayerStatus + this.player = new Player(); + this.player.preload = this.preload; + this.player.statusCallback = this.setPlayerStatus; if (this.isStream) { - this.playVideo() + this.playVideo(); this.$nextTick(() => { - this.canvas = this.$refs.areaCanvas - this.ctx = this.canvas.getContext('2d') - this.ctx.lineWidth = 1 - this.initArea() - }) + this.canvas = this.$refs.areaCanvas; + this.ctx = this.canvas.getContext("2d"); + this.ctx.lineWidth = 1; + this.initArea(); + }); } else { // 褰曞儚URL澶勭悊, 鍙兘瀛樺湪澶氫釜褰曞儚鍦板潃 - if (this.videoUrl === '') { - this.playerStatus = -1 - return + if (this.videoUrl === "") { + this.playerStatus = -1; + return; } - this.videoUrls = this.videoUrl.split('||') + this.videoUrls = this.videoUrl.split("||"); if (this.autoPlay || this.preload) { - this.playVideo() + this.playVideo(); } } }, beforeDestroy() { - this.player.stop() + this.player.stop(); }, methods: { // 鍥炴樉cavas鏁版嵁 // 鐐瑰嚮閫変腑鍙樿壊 灏嗗綋鍓嶉〉闈㈡墍鏈夎矾寰勯噸缁樺垽鏂綋鍓嶉紶鏍囩殑鍧愭爣鍦ㄥ摢涓浘褰㈠唴 濡傛灉涓嶄紶鍧愭爣鍙傛暟灏辨槸鍥炴樉鐨勬柟娉� clickSelect(e) { - this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) - let _this = this // 闆嗗悎涓亶鍘嗛渶瑕佸皢this杞瓨涓�涓嬩娇鐢� - _this.canvasData.line.forEach(function(v, i) { - _this.ctx.strokeStyle = 'yellow' - _this.ctx.beginPath() + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + let _this = this; // 闆嗗悎涓亶鍘嗛渶瑕佸皢this杞瓨涓�涓嬩娇鐢� + _this.canvasData.line.forEach(function (v, i) { + _this.ctx.strokeStyle = "yellow"; + _this.ctx.beginPath(); _this.ctx.moveTo( v.location[0].x / _this.showProportion, v.location[0].y / _this.showProportion - ) + ); _this.ctx.lineTo( v.location[1].x / _this.showProportion, v.location[1].y / _this.showProportion - ) - _this.ctx.stroke() - _this.canvas.style.cursor = 'default' - }) - _this.canvasData.rect.forEach(function(v, i) { - _this.ctx.strokeStyle = 'yellow' - _this.ctx.beginPath() + ); + _this.ctx.stroke(); + _this.canvas.style.cursor = "default"; + }); + _this.canvasData.rect.forEach(function (v, i) { + _this.ctx.strokeStyle = "yellow"; + _this.ctx.beginPath(); _this.ctx.moveTo( v.location[0].x / _this.showProportion, v.location[0].y / _this.showProportion - ) + ); _this.ctx.lineTo( v.location[1].x / _this.showProportion, v.location[1].y / _this.showProportion - ) + ); _this.ctx.lineTo( v.location[2].x / _this.showProportion, v.location[2].y / _this.showProportion - ) + ); _this.ctx.lineTo( v.location[3].x / _this.showProportion, v.location[3].y / _this.showProportion - ) + ); _this.ctx.lineTo( v.location[0].x / _this.showProportion, v.location[0].y / _this.showProportion - ) - _this.ctx.stroke() - _this.canvas.style.cursor = 'default' - }) - _this.canvasData.arrow.forEach(function(v, i) { - _this.ctx.strokeStyle = 'yellow' + ); + _this.ctx.stroke(); + _this.canvas.style.cursor = "default"; + }); + _this.canvasData.arrow.forEach(function (v, i) { + _this.ctx.strokeStyle = "yellow"; _this.drawArrow( _this.ctx, v.location[0].x / _this.showProportion, @@ -301,30 +315,31 @@ v.location[1].y / _this.showProportion, 20, 30, - 'yellow' - ) - _this.canvas.style.cursor = 'default' - }) - _this.canvasData.polygon.forEach(function(v, i) { - if (v.location.length === 0) { - return + "yellow" + ); + _this.canvas.style.cursor = "default"; + }); + _this.canvasData.polygon.forEach(function (v, i) { + if (v.location && v.location.length === 0) { + return; } - _this.ctx.strokeStyle = 'yellow' - _this.ctx.beginPath() + + _this.ctx.strokeStyle = "yellow"; + _this.ctx.beginPath(); _this.ctx.moveTo( v.location[0].x / _this.showProportion, v.location[0].y / _this.showProportionY - ) + ); for (let i = 1; i < v.location.length; i++) { _this.ctx.lineTo( v.location[i].x / _this.showProportion, v.location[i].y / _this.showProportionY - ) + ); } - _this.ctx.closePath() - _this.ctx.stroke() - _this.canvas.style.cursor = 'default' - }) + _this.ctx.closePath(); + _this.ctx.stroke(); + _this.canvas.style.cursor = "default"; + }); }, // 绠ご缁樺埗鍑芥暟 @@ -337,7 +352,7 @@ theta = 30, headlen = 10, width = 1, - color = 'yellow' + color = "yellow" ) { // ctx锛欳anvas缁樺浘鐜 // fromX, fromY锛氳捣鐐瑰潗鏍囷紙涔熷彲浠ユ崲鎴恜1锛屽彧涓嶈繃瀹冩槸涓�涓暟缁勶級 @@ -351,96 +366,95 @@ // width = typeof width !== "undefined" ? width : 1; // color = typeof color !== "undefined" ? color : "yellow"; // 璁$畻鍚勮搴﹀拰瀵瑰簲鐨凱2,P3鍧愭爣 - let angle = (Math.atan2(fromY - toY, fromX - toX) * 180) / Math.PI - let angle1 = ((angle + theta) * Math.PI) / 180 - let angle2 = ((angle - theta) * Math.PI) / 180 - let topX = headlen * Math.cos(angle1) - let topY = headlen * Math.sin(angle1) - let botX = headlen * Math.cos(angle2) - let botY = headlen * Math.sin(angle2) + let angle = (Math.atan2(fromY - toY, fromX - toX) * 180) / Math.PI; + let angle1 = ((angle + theta) * Math.PI) / 180; + let angle2 = ((angle - theta) * Math.PI) / 180; + let topX = headlen * Math.cos(angle1); + let topY = headlen * Math.sin(angle1); + let botX = headlen * Math.cos(angle2); + let botY = headlen * Math.sin(angle2); - ctx.save() - ctx.beginPath() - let arrowX = fromX - topX - let arrowY = fromY - topY - ctx.moveTo(arrowX, arrowY) - ctx.moveTo(fromX, fromY) - ctx.lineTo(toX, toY) - arrowX = toX + topX - arrowY = toY + topY - ctx.moveTo(arrowX, arrowY) - ctx.lineTo(toX, toY) - arrowX = toX + botX - arrowY = toY + botY - ctx.lineTo(arrowX, arrowY) - ctx.strokeStyle = color - ctx.lineWidth = width - ctx.stroke() - ctx.restore() + ctx.save(); + ctx.beginPath(); + let arrowX = fromX - topX; + let arrowY = fromY - topY; + ctx.moveTo(arrowX, arrowY); + ctx.moveTo(fromX, fromY); + ctx.lineTo(toX, toY); + arrowX = toX + topX; + arrowY = toY + topY; + ctx.moveTo(arrowX, arrowY); + ctx.lineTo(toX, toY); + arrowX = toX + botX; + arrowY = toY + botY; + ctx.lineTo(arrowX, arrowY); + ctx.strokeStyle = color; + ctx.lineWidth = width; + ctx.stroke(); + ctx.restore(); }, // 鍥炴樉鍥惧舰澶囨敞 showRemarks(x, y, remarks) { - this.ctx.moveTo(x, y - 10) // 鍥犱负鏀惧ぇ涔嬪悗鏄痽-20锛屾墍浠ョ缉灏忕増鐨勪负y-10 - this.ctx.fillStyle = 'green' // 璁剧疆濉厖棰滆壊涓虹豢鑹� - this.ctx.font = '10px "寰蒋闆呴粦"' // 璁剧疆瀛椾綋 - this.ctx.textBaseline = 'bottom' // 璁剧疆瀛椾綋搴曠嚎瀵归綈缁樺埗鍩虹嚎 - this.ctx.textAlign = 'left' // 璁剧疆瀛椾綋瀵归綈鐨勬柟寮� - this.ctx.fillText(remarks, x, y - 10) // 濉厖鏂囧瓧 + this.ctx.moveTo(x, y - 10); // 鍥犱负鏀惧ぇ涔嬪悗鏄痽-20锛屾墍浠ョ缉灏忕増鐨勪负y-10 + this.ctx.fillStyle = "green"; // 璁剧疆濉厖棰滆壊涓虹豢鑹� + this.ctx.font = '10px "寰蒋闆呴粦"'; // 璁剧疆瀛椾綋 + this.ctx.textBaseline = "bottom"; // 璁剧疆瀛椾綋搴曠嚎瀵归綈缁樺埗鍩虹嚎 + this.ctx.textAlign = "left"; // 璁剧疆瀛椾綋瀵归綈鐨勬柟寮� + this.ctx.fillText(remarks, x, y - 10); // 濉厖鏂囧瓧 }, getCanvasData(data) { - let polyon = { ...data } - polyon.camera_id = this.Camera.cameraId + let polyon = { ...data }; + polyon.camera_id = this.Camera.cameraId; savePolygon(polyon).then((rsp) => { - this.Camera.getPolygon() - this.Camera.getCameraTask() - }) + this.Camera.getPolygon(); + this.Camera.getCameraTask(); + }); }, setWidthHeight() { - this.canvasWidth = this.$refs.videoPlayer.offsetWidth - this.canvasHeight = this.$refs.videoPlayer.offsetHeight - console.log(this.canvasWidth, this.canvasHeight) + this.canvasWidth = this.$refs.videoPlayer.offsetWidth; + this.canvasHeight = this.$refs.videoPlayer.offsetHeight; }, async initArea() { if (!this.showCanvas) { - return + return; } const res = await getAllPolygon({ cameraId: this.TreeDataPool.selectedNode.id, - }) - this.canvasData.line = res.data.line - this.canvasData.rect = res.data.rect - this.canvasData.arrow = res.data.arrow - this.canvasData.polygon = res.data.polygon - this.clickSelect(this.canvasData) + }); + this.canvasData.line = res.data.line; + this.canvasData.rect = res.data.rect; + this.canvasData.arrow = res.data.arrow; + this.canvasData.polygon = res.data.polygon; + this.clickSelect(this.canvasData); }, initAlgoDataWebScoket() { - if (typeof WebSocket === 'undefined') { - console.log('error,鎮ㄧ殑娴忚鍣ㄤ笉鏀寔socket') + if (typeof WebSocket === "undefined") { + console.log("error,鎮ㄧ殑娴忚鍣ㄤ笉鏀寔socket"); } else { - this.algoDataSocket = new WebSocket() + this.algoDataSocket = new WebSocket(); this.algoDataSocket.onopen = () => { - console.log('socket杩炴帴鎴愬姛') - } + console.log("socket杩炴帴鎴愬姛"); + }; this.algoDataSocket.onerror = () => { - console.log('杩炴帴閿欒') - } + console.log("杩炴帴閿欒"); + }; this.algoDataSocket.onmessage = (msg) => { - console.log(msg) - } + console.log(msg); + }; } }, playVideo() { - if (this.isStream && this.rtspUrl == '') { - return + if (this.isStream && this.rtspUrl == "") { + return; } - let payload = '' - let url = '' + let payload = ""; + let url = ""; if (this.isStream) { - if (this.cameraID == '') { - this.cameraID = this.getUuid() + if (this.cameraID == "") { + this.cameraID = this.getUuid(); } payload = JSON.stringify({ @@ -448,14 +462,14 @@ rtspUrl: this.rtspUrl, isRunning: this.isRunning, isGb28181: this.isGb, - }) + }); - url = this.videoUrl + url = this.videoUrl; } else { - url = '/httpImage/' + this.videoUrls[this.playerIndex] + url = "/httpImage/" + this.videoUrls[this.playerIndex]; } - this.videoLoading = true + this.videoLoading = true; if (this.player.hPlayer == 0) { this.player.play( url, @@ -465,79 +479,81 @@ this.$refs.timeLabel, payload, () => { - this.videoLoading = false + this.videoLoading = false; } - ) + ); } else if (this.player.PlayOrPause == 0) { - this.player.resume() - this.videoLoading = false + this.player.resume(); + this.videoLoading = false; } else { - this.player.pause() - this.videoLoading = false + this.player.pause(); + this.videoLoading = false; } - this.playerStatus = this.player.PlayOrPause + this.playerStatus = this.player.PlayOrPause; - this.loadUrl = url + this.loadUrl = url; }, setPlayerStatus(stat) { - this.videoLoading = false - this.playerStatus = stat + this.videoLoading = false; + // 鎺у埗鍔犺浇鍚庣殑鎾斁鎸夐挳鐘舵�侊紝瀹炴椂娴佷负鑷姩鎾斁锛岃棰戜负preload + this.playerStatus = this.isStream ? 1 : 0; }, stopVideo() { - if (this.player.hPlayer == 0) return + if (this.player.hPlayer == 0) return; - this.player.stop() + this.player.stop(); }, fullScreen() { - if(!this.isFullScreen){ - this.player.fullscreen() + if (!this.isFullScreen) { + this.player.fullscreen(); + } else { + this.player.exitfullscreen(); } - else{ - this.player.exitfullscreen() - } - this.isFullScreen = !this.isFullScreen + this.isFullScreen = !this.isFullScreen; }, async downLoad() { if (!this.loadUrl) { - this.$notify.info({ - title: '娑堟伅', - message:'涓嬭浇澶辫触锛屾棤鏁堢殑瑙嗛鍦板潃' + this.$notify.info({ + title: "娑堟伅", + message: "涓嬭浇澶辫触锛屾棤鏁堢殑瑙嗛鍦板潃", }); + return; } if (this.isFullScreen) { - /* const screen = this.player.webglPlayer.canvas.parentNode + /* const screen = this.player.webglPlayer.canvas.parentNode var p = document.createElement("p"); var txt = document.createTextNode("璧勬簮涓嬭浇涓�,璇风◢鍚�..."); p.appendChild(txt); p.classList.add("downloadNotice"); screen.appendChild(p); */ - this.fullScreenNotice = true - setTimeout(()=>{this.fullScreenNotice = false},2000);} - - else { - this.$notify.info({ - title: '娑堟伅', - message:`璧勬簮涓嬭浇涓�,璇风◢鍚�...` + this.fullScreenNotice = true; + setTimeout(() => { + this.fullScreenNotice = false; + }, 2000); + } else { + this.$notify.info({ + title: "娑堟伅", + message: `璧勬簮涓嬭浇涓�,璇风◢鍚�...`, }); - } + } - let url = 'http://'+window.location.host+this.loadUrl + let url = "http://" + window.location.host + this.loadUrl; - // let url = "http://localhost:8080/httpImage/192.168.20.189:6700/283,2f49bf283ad7?collection=2021-09-28-DSVAD010120190703-video" - let name = url.substring(url.lastIndexOf("/") + 1) - let responsePromise = await fetch(url) - let blob = await responsePromise.blob() - let objectURL = window.URL.createObjectURL(blob) - let a = document.createElement('a') - a.href = objectURL - a.download = name - a.click() - a.remove() - /* let url = 'http:/'+this.loadUrl.substring(10) + // let url = "http://localhost:8080/httpImage/192.168.20.189:6700/283,2f49bf283ad7?collection=2021-09-28-DSVAD010120190703-video" + let name = url.substring(url.lastIndexOf("/") + 1); + let responsePromise = await fetch(url); + let blob = await responsePromise.blob(); + let objectURL = window.URL.createObjectURL(blob); + let a = document.createElement("a"); + a.href = objectURL; + a.download = name; + a.click(); + a.remove(); + /* let url = 'http:/'+this.loadUrl.substring(10) let link = document.createElement("a"); //鍒涘缓a鏍囩 let name = url.substring(url.lastIndexOf("/") + 1) link.style.display = "none"; //浣垮叾闅愯棌 @@ -545,22 +561,21 @@ link.setAttribute("download", name); //璁剧疆涓嬭浇灞炴�� 浠ュ強鏂囦欢鍚� document.body.appendChild(link); //a鏍囩鎻掕嚦椤甸潰涓� link.click(); //寮哄埗瑙﹀彂a鏍囩浜嬩欢 */ - }, playPrev() { - this.playerIndex-- - this.player.stop() - this.playVideo() + this.playerIndex--; + this.player.stop(); + this.playVideo(); }, playNext() { - this.playerIndex++ - this.player.stop() - this.playVideo() + this.playerIndex++; + this.player.stop(); + this.playVideo(); }, }, -} +}; </script> <style lang="scss"> @@ -574,7 +589,9 @@ width: 100%; height: 100%; } - +#area-canvas { + z-index: 1; +} video { object-fit: fill; width: 100%; @@ -616,9 +633,9 @@ background: rgba(255, 255, 255, 0.25); border-radius: 3px; width: 460px; - width: -webkit-calc(100% - 260px); - width: -moz-calc(100% - 260px); - width: calc(100% - 260px); + width: -webkit-calc(100% - 215px); + width: -moz-calc(100% - 215px); + width: calc(100% - 215px); float: left; margin: 19px 0 0 65px; position: relative; @@ -770,7 +787,6 @@ margin-top: 7px; margin-left: -12px; } - } .video-player:hover { @@ -824,34 +840,34 @@ background-color: pink; } - .popuptext { - /* display:none; */ - height: 50px; - line-height: 50px; - font-size: 20px; - background-color: #555; - opacity: .8; - color: #fff; - text-align: center; - border-radius: 25px; - position: relative; - top: 30px; - z-index: 1; +.popuptext { + /* display:none; */ + height: 50px; + line-height: 50px; + font-size: 20px; + background-color: #555; + opacity: 0.8; + color: #fff; + text-align: center; + border-radius: 25px; + position: relative; + top: 30px; + z-index: 1; } - .fade-enter{ - opacity: 0; - } - .fade-enter-active{ - transition: opacity .5s; - } - .fade-leave-to{ - opacity: 0; - } - .fade-leave-active{ - transition: opacity 3s; - } - .canvasDiv .el-loading-mask { - z-index: 1000 !important; - } +.fade-enter { + opacity: 0; +} +.fade-enter-active { + transition: opacity 0.5s; +} +.fade-leave-to { + opacity: 0; +} +.fade-leave-active { + transition: opacity 3s; +} +.canvasDiv .el-loading-mask { + z-index: 1000 !important; +} </style> -- Gitblit v1.8.0