From c141197a5687dda0256cb8939f73aada040c9ba9 Mon Sep 17 00:00:00 2001 From: heyujie <516346543@qq.com> Date: 星期三, 24 三月 2021 19:23:53 +0800 Subject: [PATCH] 育英项目以图搜图修改 --- src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue | 639 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 519 insertions(+), 120 deletions(-) diff --git a/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue b/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue index a6c5375..de1e4f0 100644 --- a/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue +++ b/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue @@ -1,7 +1,26 @@ <template> - <div class="content"> + <div class="video-analyze-content"> <div class="content-top"> <div class="grid-check"> + <el-dropdown + trigger="click" + :popper-append-to-body="false" + @command="handleCommand" + v-show="showLocChoise" + > + <span class="el-dropdown-link"> + {{ curCamera }}<i class="el-icon-arrow-down el-icon--right"></i> + </span> + <el-dropdown-menu slot="dropdown"> + <el-dropdown-item + v-for="(item, index) in popDownArr" + :key="index" + :command="item" + >{{ item.Camera }}</el-dropdown-item + > + </el-dropdown-menu> + </el-dropdown> + <span :class=" guid === 1 @@ -30,19 +49,17 @@ <div class="video-area"> <div class="info-list block"> <p class="title-partment">鐩稿叧瑙嗛</p> - <!-- <div class="video-name" v-for="video in videoDetails.videoList" :key="video.id"> - <i class="el-icon-film"></i> - <span>{{video.name}}</span> - </div>--> - <div - class="video-name" - :class="{ current: curVideo.ID == video.ID }" - @click="checkVideo(video, index)" - v-for="(video, index) in relativeVideos" - :key="video.ID" - > - <i class="el-icon-film"></i> - <span>{{ video.Camera }}</span> + <div class="v-name-block"> + <div + class="video-name" + :class="{ current: curVideo.ID == video.ID }" + @click="checkVideo(video, index)" + v-for="(video, index) in curRoomVideos" + :key="video.ID" + > + <i class="el-icon-film"></i> + <span>{{ video.VideoDate }}</span> + </div> </div> </div> <div class="players" ref="playerWrap"> @@ -53,11 +70,14 @@ v-for="(item, index) in videoWrapArr" :key="index" > + <div style="display: none"></div> <div class="currentPlayer"> - <!-- {{curVideo.ID}} --> - <!-- <img :src="curVideo.VideoCover" style="width:100px" /> --> <ali-player - :source="'http://' + curVideo.VideoPath" + @playing="getPlayStatus" + @pause="isStop = true" + @play="isStop = false" + @timeupdate="timeUpdate" + :source="curVideo.VideoPath" :markers="curVideo.marks" :ref="`player_${curVideo.ID}`" /> @@ -71,75 +91,122 @@ v-for="(item, index) in videoWrapArr" :key="index" @click="checkCurVideo(index)" + style="position: relative" + @mouseenter.stop.prevent="videoMouseEnter($event)" + @mouseleave="videoMouseLeave($event)" > + <!-- --> <template v-if="index <= videoArrs.length - 1"> + <div class="video-box-top"> + <b>{{ videoArrs[index].Camera }}</b> + </div> <div - :class="{ currentPlayer: curVideo.ID == videoArrs[index].ID }" + :class="{ + currentPlayer: curVideo.ID == videoArrs[index].ID, + }" > - <!-- {{videoArrs[index].ID}} --> - <!-- <img - :src="videoArrs[index].VideoCover" - style="width:100px" - />--> <ali-player - :source="'http://' + videoArrs[index].VideoPath" + @timeupdate="timeUpdate(e, index)" + :source="videoArrs[index].VideoPath" :markers="videoArrs[index].marks" + @pause="isStop = true" + @play="isStop = false" :ref="`player_${videoArrs[index].ID}`" + @ready="videoReady" /> </div> </template> </div> </template> + <div class="player-control"> + <!-- <div class="progress-bar"></div> --> + <!-- - <!-- <div - class="video-item" - :class="{'active':item.ID==curVideo.ID}" - :ref="`gridVideoItem_${index}`" - v-for="(item,index) in videoWrapArr" - :key="index" - > - </div>--> + --> + <div class="progress-bar"> + <el-tooltip + placement="top" + v-for="(item, index) in eventMarks" + :key="index" + > + <div slot="content"> + {{ getTimeStr(item.offset) }}<br />{{ item.text }} + </div> + <div + class="self-dot" + :style="{ + left: (item.offset / maxSecond) * 100 + '%', + }" + @click="dotJump(item.offset)" + ></div> + </el-tooltip> + <!-- :marks="marks" --> + <el-slider + v-model="curTime" + :format-tooltip="formatTooltip" + :max="maxSecond" + @change="progressChange" + @input="inTimeChange" + ></el-slider> + </div> + <div class="control-zone"> + <span class="time">{{ curPlayTime }} / {{ maxVideoTime }}</span> + <div class="play-btn" @click="playAll" v-if="showPlayBtn"></div> + <div class="stop-btn" @click="pauseAll" v-else></div> + </div> + </div> </div> </div> </div> <div class="content-bottom"> - <div class="bot-left block"> - <p class="title-partment">蹇�熸爣娉�</p> - <div class="flex-box" style="height: 28px"> - <label style="padding-right: 10px">闅愭偅闂:</label> - <el-radio-group v-model="isUnusual"> - <el-radio :label="0">鏃犲紓甯�</el-radio> - <el-radio :label="1">鏈夊紓甯�</el-radio> - </el-radio-group> - - <el-button - icon="el-icon-plus" - size="mini" - v-show="isUnusual == 1" - type="primary" - @click="addLabel(curVideo)" - >娣诲姞鏍囨敞</el-button - > - </div> - <div class="flex-box fixed-height-box"> - <label>鏍囨敞淇℃伅:</label> - <div class="mark-list"> - <div class="mark" v-for="mark in curVideo.LableLst" :key="mark.ID"> - <div class="time"> - <span - >{{ zeroize(Math.floor(mark.Time / 60)) }}:{{ - zeroize(mark.Time % 60) - }}</span - > - <i class="el-icon-edit" @click="editCurLabel(mark)"></i> - <i class="el-icon-delete" @click="removeCurLabel(mark)"></i> - </div> - <div class="label-content"> - <span>{{ mark.Desc }}</span> - </div> + <div class="bot-left"> + <!-- <p class="title-partment">蹇�熸爣娉�</p> --> + <el-tabs v-model="activeName" @tab-click="handleClick"> + <el-tab-pane label="蹇�熸爣娉�" name="first"> + <div class="flex-box" style="height: 28px"> + <label style="padding-right: 10px">闅愭偅闂:</label> + <el-radio-group v-model="isUnusual"> + <el-radio :label="0">鏃犲紓甯�</el-radio> + <el-radio :label="1">鏈夊紓甯�</el-radio> + </el-radio-group> + <el-button + icon="el-icon-plus" + size="mini" + v-show="isUnusual == 1" + type="primary" + @click="addLabel(curVideo)" + >娣诲姞鏍囨敞</el-button + > </div> - </div> - </div> + <div class="flex-box fixed-height-box"> + <label v-if="!showTable">鏍囨敞淇℃伅:</label> + <div class="mark-list" v-if="!showTable"> + <div + class="mark" + v-for="mark in curVideo.LableLst" + :key="mark.ID" + > + <div class="time"> + <span + >{{ zeroize(Math.floor(mark.Time / 60)) }}:{{ + zeroize(mark.Time % 60) + }}</span + > + <i class="el-icon-edit" @click="editCurLabel(mark)"></i> + <i class="el-icon-delete" @click="removeCurLabel(mark)"></i> + </div> + <div class="label-content"> + <span>{{ mark.Desc }}</span> + </div> + </div> + </div> + </div></el-tab-pane + > + <!-- <div class="flex-box fixed-height-box2"></div> --> + <dataset-chart style="width: 100%" v-if="showTable"></dataset-chart> + + <el-tab-pane label="閲岀▼鏍�" name="second"> </el-tab-pane> + </el-tabs> </div> <div class="bot-right block"> <p class="title-partment">瑙嗛璇︽儏</p> @@ -157,8 +224,8 @@ <span>{{ videoDetails.VideoDate }}</span> </div> <div> - <label>鍙告満|鍓徃鏈�:</label> - <span>{{ videoDetails.Driver1 }}|{{ videoDetails.Driver2 }}</span> + <label>鍙告満 | 鍓徃鏈�:</label> + <span>{{ videoDetails.Driver1 }} | {{ videoDetails.Driver2 }}</span> </div> </div> </div> @@ -169,14 +236,15 @@ :visible="labelDialogVisible" @close="labelDialogVisible = false" :append-to-body="false" + :modal="false" > - <div class="label-radio"> + <!-- <div class="label-radio"> <p class="label">閫夋嫨灏嗚鏍囨敞鐨勮棰�:</p> <el-radio-group v-model="isCheckAllVideo"> <el-radio :label="1">鏍囨敞鍦ㄥ叏閮ㄤ綅缃殑瑙嗛娈�</el-radio> <el-radio :label="0">浠呮爣娉ㄩ�変腑鐨勮棰戞</el-radio> </el-radio-group> - </div> + </div> --> <div class="label-check"> <p class="label">闅愭偅闂:</p> <el-checkbox-group v-model="labelCheckedList"> @@ -204,16 +272,19 @@ updateVideoAnalyze, getlst, getRelatedVideoInfo, + getCarVideos, getLabelMap, delLabel, editLabel, } from "@/api/shuohuang"; +import DatasetChart from "./charts/datasetForVideo"; import AliPlayer from "./aliPlayer/index"; export default { name: "VideoAnalyze", components: { AliPlayer, + DatasetChart, }, props: { videoDetails: { @@ -231,12 +302,32 @@ isUnusual: "", videoArrs: [], relativeVideos: [], + allCurVideos: [], labelCheckedList: [], videoWrapArr: [], labelOptions: [], selectedLabelId: "", setLabelTime: 0, isCheckAllVideo: 1, + curRoomVideos: [], + popDownArr: [], + curCamera: "", + showTable: false, + showLocChoise: true, + activeName: "first", + curTime: 0, + showPlayBtn: true, + eventMarks: [], + marks: { + 45: {}, + 373: {}, + }, + labelMarks: [], + maxDuration: 0, + maxVideoTime: "", + curPlayTime: "00:00", + maxSecond: 0, + isStop: false, }; }, watch: { @@ -252,18 +343,143 @@ }, videoDetails: { handler(newVal, oldVal) { - this.getVideos(newVal); + this.getCurVideos(newVal); }, deep: true, }, }, mounted() { - console.log("analyze mount"); this.renderLabelOpts(); this.setGuid(1); - this.getVideos(this.videoDetails); + this.getCurVideos(this.videoDetails); + this.getRelatedVideos(this.videoDetails); }, methods: { + getPlayStatus(e) { + console.log(e, 1111); + }, + videoReady(a, b) {}, + playAll() { + this.showPlayBtn = false; + if (this.guid == 1) { + this.$refs[`player_${this.curVideo.ID}`][0].play(); + this.maxDuration = this.$refs[ + `player_${this.curVideo.ID}` + ][0].getDuration(); + } else { + this.videoArrs.forEach((v) => { + this.$refs[`player_${v.ID}`][0].play(); + }); + } + }, + pauseAll() { + this.showPlayBtn = true; + if (this.guid == 1) { + this.$refs[`player_${this.curVideo.ID}`][0].pause(); + } else { + this.videoArrs.forEach((v) => { + this.$refs[`player_${v.ID}`][0].pause(); + }); + } + }, + inTimeChange(val) {}, + progressChange(val) { + console.log(val); + this.showPlayBtn = false; + this.curPlayTime = this.getTimeStr(val); + let that = this; + if (this.guid == 1) { + this.$refs[`player_${this.curVideo.ID}`][0].pause(); + this.$refs[`player_${this.curVideo.ID}`][0].seek(val); + this.$refs[`player_${this.curVideo.ID}`][0].play(); + setTimeout(() => { + let curT = that.$refs[ + `player_${that.curVideo.ID}` + ][0].getCurrentTime(); + that.barRolling(curT); + }, 600); + } else { + this.videoArrs.forEach((v, i) => { + this.$refs[`player_${v.ID}`][0].seek(val); + this.$refs[`player_${v.ID}`][0].play(); + if (i == 0) { + let curT = this.$refs[`player_${v.ID}`][0].getCurrentTime(); + this.barRolling(curT); + } + }); + } + }, + getTimeStr(sec) { + return `${ + Math.floor(sec / 60) < 10 + ? "0" + Math.floor(sec / 60) + : Math.floor(sec / 60) + }:${ + Math.floor(sec % 60) < 10 + ? "0" + Math.floor(sec % 60) + : Math.floor(sec % 60) + }`; + }, + barRolling(curT) {}, + timeUpdate(e, index) { + if (this.isStop) { + return; + } + let curT; + if (this.guid == 1) { + curT = Math.floor( + this.$refs[`player_${this.curVideo.ID}`][0].getCurrentTime() + ); + } else { + curT = Math.floor( + this.$refs[`player_${this.videoArrs[index].ID}`][0].getCurrentTime() + ); + } + if (curT <= this.curTime) { + return; + } else { + this.curTime = curT; + } + this.curPlayTime = this.getTimeStr(this.curTime); + }, + formatTooltip(val) { + return this.curPlayTime; + }, + videoMouseEnter(e) { + let target = e.target; + if (target.children.length > 1) { + target.children[0].style.display = "block"; + } + }, + videoMouseLeave(e) { + let target = e.target; + if ( + target.children.length == 2 && + target.children[0].className == "video-box-top" + ) { + target.children[0].style.display = "none"; + } + }, + handleClick(instance) { + if (instance.name == "second") { + this.showTable = true; + } else { + this.showTable = false; + } + }, + handleCommand(cmd) { + let _this = this; + this.curCamera = cmd.Camera; + this.curRoomVideos = this.allCurVideos.filter((item) => { + return item.Camera == cmd.Camera; + }); + this.curVideo = this.curRoomVideos.find((item) => { + return item.UniqeID == this.curVideo.UniqeID; + }); + this.$nextTick(() => { + _this.$refs[`player_${_this.curVideo.ID}`][0].init(); + }); + }, zeroize(val) { return val < 10 ? "0" + val : val; }, @@ -273,21 +489,80 @@ this.refreshCurVideoLabel(this.curVideo); } }, - getVideos(video) { + getCurVideos(v) { let _this = this; - getRelatedVideoInfo({ UniqeID: video.UniqeID }).then((res) => { - console.log(res); - res.data.forEach((element) => { - element.marks = _this.mergeMarks(element); - console.log(element.marks); + getCarVideos({ + TrainNumber: v.TrainNumber, + CarNumber: v.CarNumber, + Driver1: v.Driver1, + }).then((res) => { + res.data.forEach((item) => { + item.marks = _this.mergeMarks(item); }); - _this.curVideo = res.data.find((item) => item.ID == video.ID); - //_this.curVideo = res.data[0]; - _this.videoArrs = res.data; - _this.relativeVideos = res.data; + _this.curVideo = res.data.find((item) => item.ID == v.ID); + console.log(_this.curVideo); + let map = {}, + map2 = {}; + let arr1 = [], + arr2 = []; + _this.curVideo.marks.forEach((item) => { + if (item.type == 0) { + map[item.offset] = { + style: { + color: "white", + }, + label: item.text, + }; + } else { + map[+item.offset] = { + style: { + color: "yellow", + }, + label: item.text, + }; + } + }); + // _this.eventMarks = map + _this.labelMarks = map2; + + // videoInfo.EventLst.forEach((item) => { + // map[item.SecondsInVideo] = { + // style:{ + // color: 'black' + // }, + // label: item.Event + (item.Desc == "" ? "" : ": " + item.Desc) + // } + // }); + + if (this.guid == 1) { + this.maxVideoTime = this.curVideo.VideoTime; + } + _this.videoArrs = res.data.filter((item) => v.UniqeID == item.UniqeID); + _this.allCurVideos = res.data; + _this.curRoomVideos = _this.allCurVideos.filter((item) => { + return item.Camera == "鍙告満瀹�"; + }); + this.$nextTick(() => { _this.$refs[`player_${_this.curVideo.ID}`][0].init(); + let arr = this.maxVideoTime.split(":"); + let min = +arr[0], + sec = +arr[1]; + this.maxSecond = min * 60 + sec; }); + }); + }, + getRelatedVideos(video) { + let _this = this; + getRelatedVideoInfo({ UniqeID: video.UniqeID }).then((res) => { + let arr = []; + let map = {}; + res.data.forEach((item) => { + this.popDownArr.push(item); + }); + if (this.popDownArr.length) { + this.curCamera = this.popDownArr[0].Camera; + } }); }, renderLabelOpts() { @@ -302,49 +577,54 @@ if (d.ID === video.ID) { video.LableLst = d.LableLst; } - // let someVideo = _this.videoArrs.find(video => video.ID === d.ID); - // someVideo.LableLst = d.LableLst }); }); }, checkVideo(video, index) { this.refreshCurVideoLabel(video); this.curVideo = video; + this.videoArrs = this.allCurVideos.filter( + (item) => video.UniqeID == item.UniqeID + ); this.$nextTick(() => { this.$refs[`player_${this.curVideo.ID}`][0].init(); }); }, - setGuid(guid) { let _this = this; this.guid = guid; - // for(var i = 0; i < Math.pow(guid,2); i++){ - // if(i>this.videoArrs.length-1){ - // this.videoWrapArr[i] = this.videoArrs[i] - // }else{ - // this.videoWrapArr[i] = {} - // } - // } + if (guid == 1) { + this.showLocChoise = true; + } else { + this.showLocChoise = false; + this.$refs[`player_${this.curVideo.ID}`][0].pause(); + this.$refs[`player_${this.curVideo.ID}`][0].seek(0); + } this.videoWrapArr = Math.pow(guid, 2); this.$nextTick(() => { for (var i = 0; i < Math.pow(guid, 2); i++) { + console.log(`calc(` + 100 / guid + `% -10px)`); this.$refs[`gridVideoItem_${i}`][0].style.width = - this.$refs["playerWrap"].offsetWidth / guid + "px"; + `calc(` + 100 / guid + `%)`; + // this.$refs["playerWrap"].offsetWidth / guid + "px"; this.$refs[`gridVideoItem_${i}`][0].style.height = - this.$refs["playerWrap"].offsetHeight / guid + "px"; + `calc(` + 100 / guid + `%)`; + // this.$refs["playerWrap"].offsetHeight / guid + "px"; } + console.log(this.$refs[`player_${this.videoArrs[index].ID}`]); }); }, - cancelLabelChecked() { this.labelDialogVisible = false; + }, + dotJump(offset){ + this.curTime = offset + this.progressChange(offset) }, submitLabelChecked() { let _this = this; let tempArr = []; - if (this.isCheckAllVideo == 1) { - tempArr = this.videoArrs.map((video) => video.ID); - } + tempArr = this.videoArrs.map((video) => video.ID); let desc = this.labelCheckedList.map((lableId) => { for (let label of this.labelOptions) { if (label.ID == lableId) { @@ -355,9 +635,7 @@ let query = { ID: this.selectedLabelId, - ParentID: this.isCheckAllVideo - ? tempArr.join(",") - : this.curVideo.ID + "", + ParentID: tempArr.join(","), ParentUniqID: this.curVideo.UniqeID + "", Time: Math.round(this.setLabelTime) + "", Codes: this.labelCheckedList.join(","), @@ -383,6 +661,7 @@ this.$message.success("娣诲姞鎴愬姛"); // 鏍囨敞 _this.setMarks(this.curVideo); + _this.$parent.$parent.filterSearchData(); } else { this.$message.warning(rsp.msg); } @@ -409,26 +688,31 @@ this.$message.success("鍒犻櫎鎴愬姛"); // 鏍囨敞 _this.setMarks(_this.curVideo); + _this.$parent.$parent.filterSearchData(); } else { this.$message.warning(rsp.msg); } }); }, mergeMarks(videoInfo) { - // debugger - const eMarks = videoInfo.EventLst.map(function (item) { - return { - offset: item.SecondsInVideo + "", + const eMarks = videoInfo.EventLst.map((item) => { + let obj = { + offset: item.SecondsInVideo, text: item.Event + (item.Desc == "" ? "" : ": " + item.Desc), + type: 0, }; + this.eventMarks.push(obj); + return obj; }); const labMarks = videoInfo.LableLst.map((lable) => { - return { + let obj = { offset: lable.Time, text: lable.Desc, + type: 1, }; + this.labelMarks.push(obj); + return obj; }); - return eMarks.concat(labMarks); }, setMarks(video) { @@ -439,17 +723,37 @@ }; </script> -<style lang="scss"> -.content { - padding: 15px; +<style lang="scss" > +.video-analyze-content { + margin: 0; + padding: 6px 15px 15px 15px; + height: 100%; + text-align: left; .content-top { - margin-bottom: 10px; + margin-bottom: 15px; + + // height: calc(60% + -16px); + .grid-check { text-align: right; - margin-bottom: 6px; + margin-bottom: 3px; + position: relative; + .el-dropdown { + position: absolute; + top: -4px; + left: 200px; + } + .el-dropdown-link { + cursor: pointer; + color: #409eff; + } + .el-icon-arrow-down { + font-size: 12px; + } span { - font-size: 20px; + font-size: 17px; + color: #cacaca; padding-left: 12px; cursor: pointer; @@ -460,9 +764,17 @@ } .video-area { display: flex; + height: 100%; + .info-list { - width: 160px; + width: 180px; + min-width: 180px; margin-right: 10px; + .v-name-block { + height: 484px; + + overflow: auto; + } .video-name { cursor: pointer; color: #777; @@ -476,10 +788,10 @@ } } .players { - width: 960px; - height: 540px; + width: 100%; display: flex; flex-wrap: wrap; + height: 455px; .video-item { background: black; border: 1px solid #fff; @@ -488,6 +800,22 @@ height: 100%; & > div { height: 100%; + } + } + .video-box-top { + color: white; + display: none; + width: 100%; + height: 32px; + line-height: 32px; + padding: 0px 20px; + box-sizing: border-box; + background: #27293190; + position: absolute; + top: 0px; + z-index: 2; + b { + float: left; } } .currentPlayer { @@ -499,13 +827,78 @@ } } } + .player-control { + background-color: black; + height: 75px; + width: 100%; + .progress-bar { + margin: 0px 30px; + position: relative; + .self-dot { + top: 16px; + position: absolute; + height: 6px; + width: 3px; + z-index: 1; + background-color: lightcoral; + border-radius: 60%; + // pointer-events: none; + cursor: pointer; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } + .el-slider__button { + width: 12px; + height: 12px; + } + .el-slider__stop { + background-color: lightcoral; + } + } + .control-zone { + .time { + float: left; + margin-left: 23px; + color: #fff; + } + .play-btn { + width: 24px; + height: 24px; + cursor: pointer; + background: url(/apps/shuohuangMonitorAnalyze/img/bigplay.png) + no-repeat; + background-size: contain; + margin: 0 auto; + } + .stop-btn { + width: 24px; + height: 24px; + cursor: pointer; + background: url(/apps/shuohuangMonitorAnalyze/img/smallpause.png) + no-repeat; + background-size: contain; + margin: 0 auto; + } + } + } } } } .content-bottom { display: flex; + .bot-left { flex: 1; + padding: 0px 15px 8px 15px; + background: #fff; + border-radius: 3px; + min-width: 400px; + height: 343px; + .el-tabs__header { + padding: 0; + position: relative; + margin: 0 0 10px; + } .flex-box { align-items: baseline; label { @@ -535,10 +928,16 @@ height: 200px; overflow-y: auto; } + .fixed-height-box2 { + height: 228px; + overflow-y: auto; + } } .bot-right { width: 210px; margin-left: 10px; + min-width: 210px; + label { color: #999; padding-right: 8px; @@ -549,7 +948,7 @@ .label-dialog { .el-dialog { width: 700px !important; - height: 670px !important; + height: 558px !important; .el-dialog__header { height: 20px; } -- Gitblit v1.8.0