From 85da22c4861736f7b0cabbc75daecbe4fea1bf80 Mon Sep 17 00:00:00 2001 From: heyujie <516346543@qq.com> Date: 星期日, 04 七月 2021 21:01:12 +0800 Subject: [PATCH] 周天更改 --- src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue | 821 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 588 insertions(+), 233 deletions(-) diff --git a/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue b/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue index 191953e..002a367 100644 --- a/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue +++ b/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue @@ -2,16 +2,25 @@ <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> - + <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 videoArrs" + :key="index" + :command="item" + >{{ item.CameraPosition }}</el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> + <span :class=" guid === 1 @@ -42,15 +51,15 @@ <p class="title-partment">鐩稿叧瑙嗛</p> <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> + class="video-name" + :class="{ current: curVideo.GroupID == video.GroupID }" + @click="checkVideo(video)" + v-for="(video, index) in curRoomVideos" + :key="index" + > + <i class="el-icon-film"></i> + <span>{{ video.StartTime }}</span> + </div> </div> </div> <div class="players" ref="playerWrap"> @@ -59,15 +68,17 @@ class="video-item" :ref="`gridVideoItem_${index}`" v-for="(item, index) in videoWrapArr" - :key="index" + :key="item.id" > + <div style="display: none"></div> <div class="currentPlayer"> - <!-- {{curVideo.ID}} --> - <!-- <img :src="curVideo.VideoCover" style="width:100px" /> --> <ali-player - :source="curVideo.VideoPath" + @pause="isStop = true" + @play="isStop = false" + @timeupdate="timeUpdate" + :source="curVideo.VideoPath | fixPath" :markers="curVideo.marks" - :ref="`player_${curVideo.ID}`" + :ref="`player_${curVideo.id}`" /> </div> </div> @@ -77,82 +88,146 @@ class="video-item" :ref="`gridVideoItem_${index}`" v-for="(item, index) in videoWrapArr" - :key="index" + :key="item.id" @click="checkCurVideo(index)" - style="position: relative;" + 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].CameraPosition }}</b> + </div> <div - :class="{ currentPlayer: curVideo.ID == videoArrs[index].ID,videoZone:true }" - @mouseover="overShowLoc(index)" + :class="{ + currentPlayer: curVideo.ID == videoArrs[index].ID, + }" > - <!-- @mouseover="" --> - <!-- {{videoArrs[index].ID}} --> - <!-- <img - :src="videoArrs[index].VideoCover" - style="width:100px" - />--> - <div class="pos-desc" style="position: absolute;top: 5px;left: 10px;color: #fff;z-index: 1;height: fit-content;background-color: black;">{{videoArrs[index].Camera}}</div> <ali-player - :source="videoArrs[index].VideoPath" + @timeupdate="timeUpdate(e, index)" + :source="videoArrs[index].VideoPath | fixPath" :markers="videoArrs[index].marks" - :ref="`player_${videoArrs[index].ID}`" + @pause="isStop = true" + @play="isStop = false" + :ref="`player_${videoArrs[index].id}`" /> </div> </template> </div> </template> + <div class="player-control"> + <div class="progress-bar"> + <el-tooltip + placement="top" + v-for="(item, index) in eventMarks" + :key="item.offset + 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> + <el-tooltip placement="top" v-for="(item, index) in labelMarks" :key="index"> + <div slot="content"> + {{ getTimeStr(item.offset) }} + <br /> + {{ item.text }} + </div> + <div + class="label-dot" + :style="{ + left: (item.offset / maxSecond) * 100 + '%', + }" + @click="dotJump(item.offset)" + ></div> + </el-tooltip> + <div ref="time-clip" class="time-clip"></div> + + <el-slider + v-model="curTime" + :show-tooltip="false" + :max="maxSecond" + @mousemove.native.stop="triggerHover" + @mouseleave.native="leaveBar" + @mouseover.native="intoBar" + @change="progressChange" + ></el-slider> + </div> + <div class="control-zone"> + <span class="time">{{ curPlayTime }} / {{ maxVideoTime }}</span> + <div class="play-btn"> + <div class="group"> + <i class="el-icon-d-arrow-left" @click="moveBar(-10)"></i> + <i + class="el-icon-video-play" + style="font-size: 29px; cursor: pointer" + @click="playAll" + v-if="showPlayBtn" + ></i> + <i + class="el-icon-video-pause" + style="font-size: 29px; cursor: pointer" + @click="pauseAll" + v-else + ></i> + <i class="el-icon-d-arrow-right" @click="moveBar(10)"></i> + </div> + <!-- <span class="icon iconfont"></span> --> + </div> + </div> + </div> </div> </div> </div> <div class="content-bottom"> - <div class="bot-left "> + <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 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> + <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 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>{{ pad0(Math.floor(mark.Time / 60)) }}:{{ pad0(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> - </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> + <!-- <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-tab-pane label="鍏噷鏍�" name="second"></el-tab-pane> </el-tabs> - </div> <div class="bot-right block"> <p class="title-partment">瑙嗛璇︽儏</p> @@ -167,7 +242,7 @@ </div> <div> <label>鏃堕棿:</label> - <span>{{ videoDetails.VideoDate }}</span> + <span>{{ videoDetails.StartTime }}</span> </div> <div> <label>鍙告満 | 鍓徃鏈�:</label> @@ -182,8 +257,7 @@ :visible="labelDialogVisible" @close="labelDialogVisible = false" :append-to-body="false" - :modal="false" - + :modal="false" > <!-- <div class="label-radio"> <p class="label">閫夋嫨灏嗚鏍囨敞鐨勮棰�:</p> @@ -191,23 +265,16 @@ <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"> - <el-checkbox - v-for="item in labelOptions" - :key="item.ID" - :label="item.ID" - >{{ item.Name }}</el-checkbox - > + <el-checkbox v-for="item in labelOptions" :key="item.ID" :label="item.ID">{{ item.Name }}</el-checkbox> </el-checkbox-group> </div> <div class="btns"> <el-button @click="cancelLabelChecked" size="small">鍙栨秷</el-button> - <el-button @click="submitLabelChecked()" size="small" type="primary" - >纭畾</el-button - > + <el-button @click="submitLabelChecked" size="small" type="primary">纭畾</el-button> </div> </el-dialog> </div> @@ -215,17 +282,35 @@ <script> import { - getlstInit, - updateVideoAnalyze, - getlst, getRelatedVideoInfo, getCarVideos, getLabelMap, delLabel, editLabel, } from "@/api/shuohuang"; -import DatasetChart from './charts/datasetForVideo'; +import DatasetChart from "./charts/datasetForVideo"; import AliPlayer from "./aliPlayer/index"; + +function throttle(fn, delay) { + // 璁板綍涓婁竴娆″嚱鏁拌Е鍙戠殑鏃堕棿浠ュ強瀹氫箟涓�涓畾鏃跺櫒 + var lastTime, timer; + var delay = delay || 500; + return function (e) { + var nowTime = Date.now(); + if (lastTime && nowTime - lastTime < delay) { + clearTimeout(timer); + timer = setTimeout(function () { + // 璁板綍涓婁竴娆″嚱鏁拌Е鍙戠殑鏃堕棿 + lastTime = nowTime; + // 淇this鎸囧悜闂 + fn.call(this, e); + }, delay); + } else { + lastTime = nowTime; + fn.call(this, e); + } + }; +} export default { name: "VideoAnalyze", @@ -241,6 +326,15 @@ type: Object, }, }, + filters: { + fixPath(str) { + if (!str || str == undefined) { + return ""; + } + + return str.replace("/opt/vasystem", ""); + }, + }, data() { return { guid: 1, @@ -249,19 +343,28 @@ isUnusual: "", videoArrs: [], relativeVideos: [], - allCurVideos:[], + allCurVideos: [], labelCheckedList: [], videoWrapArr: [], labelOptions: [], selectedLabelId: "", setLabelTime: 0, isCheckAllVideo: 1, - curRoomVideos:[], - popDownArr:[], - curCamera:"", - showTable:false, - showLocChoise:true, - activeName:"first", + curRoomVideos: [], + curCamera: "", + showTable: false, + showLocChoise: true, + activeName: "first", + curTime: 0, + showPlayBtn: true, + eventMarks: [], + marks: {}, + labelMarks: [], + maxDuration: 0, + maxVideoTime: "", + curPlayTime: "00:00", + maxSecond: 0, + isStop: false, }; }, watch: { @@ -276,39 +379,163 @@ deep: true, }, videoDetails: { - handler(newVal, oldVal) { + handler(newVal) { this.getCurVideos(newVal); }, deep: true, }, + curTime(newVal) { + this.curPlayTime = this.getTimeStr(newVal); + }, }, mounted() { + this.renderLabelOpts(); + this.setGuid(1); + this.getCurVideos(this.videoDetails); - this.getRelatedVideos(this.videoDetails) + + this.getRelatedVideos(this.videoDetails); + }, + destroyed() { + this.videoArrs.length = 0; }, methods: { - handleClick(instance){ - if (instance.name=="second") { - this.showTable=true - }else{ - this.showTable=false + triggerHover(e) { + let fn = throttle(this.hoverAction, 2000); + fn(e); + }, + hoverAction(e) { + console.log(e.target.className); + if ( + e.target.className == "el-slider__button-wrapper hover" || + e.target.className == "el-tooltip el-slider__button hover" + ) { + this.$refs["time-clip"].style["left"] = + (this.curTime / this.maxSecond) * 880 - 20 + "px"; + this.$refs["time-clip"].innerHTML = this.curPlayTime; + return; + } + this.$refs["time-clip"].style["left"] = e.offsetX - 20 + "px"; + this.$refs["time-clip"].innerHTML = this.getTimeStr( + (e.offsetX / 880) * this.maxSecond + ); + }, + intoBar(e) { + this.$refs["time-clip"].style["display"] = "block"; + }, + leaveBar(e) { + this.$refs["time-clip"].style["display"] = "none"; + }, + 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(); + }); } }, - handleCommand(cmd){ - 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(); + 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(); }); + } }, - zeroize(val) { + moveBar(val) { + this.curTime += val; + this.progressChange(this.curTime); + }, + progressChange(val) { + this.showPlayBtn = false; + 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(); + }, 600); + } else { + this.videoArrs.forEach((v, i) => { + this.$refs[`player_${v.id}`][0].seek(val); + if (i == 0) { + let curT = this.$refs[`player_${v.id}`][0].getCurrentTime(); + } + }); + } + }, + getTimeStr(sec) { + return `${this.pad0(Math.floor(sec / 60))}:${this.pad0( + Math.floor(sec % 60) + )}`; + }, + 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; + } + }, + 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) { + console.log(cmd) + console.log(this.$refs) + + let _this = this; + _this.curVideo = cmd; + _this.curCamera = _this.curVideo.CameraPosition; + _this.$nextTick(() => { + console.log(_this.$refs) + _this.$refs[`player_${_this.curVideo.id}`][0].init(); + }); + }, + pad0(val) { return val < 10 ? "0" + val : val; }, checkCurVideo(index) { @@ -317,39 +544,48 @@ this.refreshCurVideoLabel(this.curVideo); } }, - getCurVideos(v){ + getCurVideos(v) { let _this = this; 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 == v.ID) - // debugger - _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(); + TrainNumber: v.TrainNumber, + CarNumber: v.CarNumber, + Driver1: v.Driver1, + }).then((res) => { + res.data.forEach((item) => { + item.marks = _this.mergeMarks(item); }); - }) - }, - 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 + + _this.allCurVideos = res.data; + + _this.curVideo = res.data.find((item) => item.id == v.id); + + _this.refreshCurVideoLabel(_this.curVideo) + + // 璁剧疆涓嬫媺鑿滃崟閫変腑椤� + _this.curCamera = _this.curVideo.CameraPosition; + + _this.curVideo.marks.forEach((item) => { + if (item.type == 0) { + _this.eventMarks.push(item); + } else { + _this.labelMarks.push(item); + } + }); + + if (_this.guid == 1) { + _this.maxVideoTime = _this.curVideo.VideoTime; } + + _this.curRoomVideos = _this.allCurVideos.filter((item) => { + return item.IsCab == "0"; + }); + _this.$nextTick(() => { + _this.$refs[`player_${_this.curVideo.id}`][0].init(); + let arr = _this.maxVideoTime.split(":"); + let min = +arr[1], + sec = +arr[2]; + _this.maxSecond = min * 60 + sec; + }); }); }, renderLabelOpts() { @@ -359,62 +595,61 @@ }); }, refreshCurVideoLabel(video) { - getRelatedVideoInfo({ UniqeID: video.UniqeID }).then((res) => { - res.data.forEach((d) => { - if (d.ID === video.ID) { - video.LableLst = d.LableLst; - } - // let someVideo = _this.videoArrs.find(video => video.ID === d.ID); - // someVideo.LableLst = d.LableLst - }); - }); + let arr = [video] + this.videoArrs = arr.concat(this.allCurVideos.filter(v => { + return v.GroupID == video.GroupID && v.id != video.id + })) }, - checkVideo(video, index) { - // debugger + checkVideo(video) { + console.log(video) this.refreshCurVideoLabel(video); this.curVideo = video; - this.videoArrs = this.allCurVideos.filter(item=> video.UniqeID== item.UniqeID); + this.eventMarks = [] + this.labelMarks = [] + video.marks.forEach((item) => { + if (item.type == 0) { + this.eventMarks.push(item); + } else { + this.labelMarks.push(item); + } + }) this.$nextTick(() => { - this.$refs[`player_${this.curVideo.ID}`][0].init(); + this.$refs[`player_${this.curVideo.id}`][0].init(); + console.log(this.$refs) }); }, - setGuid(guid) { let _this = this; this.guid = guid; - if (guid==1) { - this.showLocChoise=true - }else{ - this.showLocChoise=false + 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); } - // 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] = {} - // } - // } this.videoWrapArr = Math.pow(guid, 2); this.$nextTick(() => { for (var i = 0; i < Math.pow(guid, 2); i++) { this.$refs[`gridVideoItem_${i}`][0].style.width = - this.$refs["playerWrap"].offsetWidth / guid + "px"; + `calc(` + 100 / guid + `%)`; this.$refs[`gridVideoItem_${i}`][0].style.height = - this.$refs["playerWrap"].offsetHeight / guid + "px"; + `calc(` + 100 / guid + `%)`; } }); }, - 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) { @@ -425,35 +660,32 @@ let query = { ID: this.selectedLabelId, - ParentID: tempArr.join(","), - ParentUniqID: this.curVideo.UniqeID + "", + VideoIds: tempArr.join(","), Time: Math.round(this.setLabelTime) + "", Codes: this.labelCheckedList.join(","), - Desc: desc.join("锛�"), + Desc: desc.join(","), }; + editLabel(query).then((rsp) => { if (rsp && rsp.success) { _this.labelDialogVisible = false; - this.$set(_this.curVideo, "LableLst", []); - //_this.curVideo.LableLst = []; + _this.$set(_this.curVideo, "LableLst", []); rsp.data.forEach((label) => { if (label.ParentID == _this.curVideo.ID) { _this.curVideo.LableLst.push(label); } }); - // getRelatedVideoInfo({ UniqeID: _this.videoDetails.UniqeID }).then(res => { - // res.data.forEach(d => { - // let someVideo = _this.videoArrs.find(video => video.ID === d.ID); - // someVideo.LableLst = d.LableLst - // }) - // }) - - this.$message.success("娣诲姞鎴愬姛"); + _this.labelMarks.push({ + type: 1, + offset: +query.Time, + text: query.Desc, + }); + _this.$message.success("娣诲姞鎴愬姛"); // 鏍囨敞 - _this.setMarks(this.curVideo); + _this.setMarks(_this.curVideo); _this.$parent.$parent.filterSearchData(); } else { - this.$message.warning(rsp.msg); + _this.$message.warning(rsp.msg); } }); }, @@ -461,48 +693,65 @@ this.labelCheckedList = []; this.selectedLabelId = ""; this.labelDialogVisible = true; - // 淇濆瓨鐐瑰嚮鏍囨敞鐨勬椂闂� - this.setLabelTime = this.$refs[`player_${video.ID}`][0].getCurrentTime(); + this.setLabelTime = this.$refs[`player_${video.id}`][0].getCurrentTime(); }, editCurLabel(mark) { this.selectedLabelId = mark.ID; - this.labelCheckedList = mark.Codes.split(" ,"); + this.labelCheckedList = mark.Codes.split(","); this.labelDialogVisible = true; }, removeCurLabel(mark) { let _this = this; - delLabel({ ID: mark.ID, ParentID: this.curVideo.ID }).then((rsp) => { + let obj = { + ID: mark.ID, + VideoIds: mark.VideoIds, + }; + delLabel(obj).then((rsp) => { if (rsp && rsp.success) { _this.curVideo.LableLst = rsp.data; - this.$message.success("鍒犻櫎鎴愬姛"); + _this.$message.success("鍒犻櫎鎴愬姛"); // 鏍囨敞 + _this.labelMarks.length = 0; + _this.curVideo.LableLst.forEach((x) => { + _this.labelMarks.push({ + type: 1, + offset: +x.Time, + text: x.Desc, + }); + }); _this.setMarks(_this.curVideo); _this.$parent.$parent.filterSearchData(); } else { - this.$message.warning(rsp.msg); + _this.$message.warning(rsp.msg); } }); }, mergeMarks(videoInfo) { - const eMarks = videoInfo.EventLst.map(function (item) { + if (!videoInfo.EventLst || !videoInfo.LableLst) { + console.log("mergeMarks data null"); + return; + } + + const eMarks = videoInfo.EventLst.map((item) => { return { - offset: item.SecondsInVideo + "", + offset: item.SecondsInVideo, text: item.Event + (item.Desc == "" ? "" : ": " + item.Desc), + type: 0, }; }); const labMarks = videoInfo.LableLst.map((lable) => { return { - offset: lable.Time, + offset: +lable.Time, text: lable.Desc, + type: 1, }; }); - return eMarks.concat(labMarks); }, setMarks(video) { let marks = this.mergeMarks(video); - this.$refs[`player_${video.ID}`][0].setProgressMarkers(marks); + this.$refs[`player_${video.id}`][0].setProgressMarkers(marks); }, }, }; @@ -511,30 +760,31 @@ <style lang="scss" > .video-analyze-content { margin: 0; - padding: 6px 15px 15px 15px; + 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: 3px; + margin-bottom: 3px; position: relative; - .el-dropdown{ + .el-dropdown { position: absolute; top: -4px; left: 200px; } .el-dropdown-link { cursor: pointer; - color: #409EFF; + color: #409eff; } .el-icon-arrow-down { font-size: 12px; } span { - font-size: 17px; - + font-size: 17px; color: #cacaca; padding-left: 12px; cursor: pointer; @@ -545,14 +795,14 @@ } .video-area { display: flex; + height: 100%; .info-list { - width: 180px; - + width: 180px; + min-width: 180px; margin-right: 10px; - .v-name-block{ + .v-name-block { height: 484px; - - overflow: auto; + overflow: auto; } .video-name { cursor: pointer; @@ -567,20 +817,34 @@ } } .players { - width: 940px; - - height: 530px; + width: 100%; display: flex; flex-wrap: wrap; + height: 455px; .video-item { background: black; border: 1px solid #fff; box-sizing: border-box; - & > div { 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 { @@ -592,21 +856,113 @@ } } } + .player-control { + background-color: #fff; + height: 75px; + width: 100%; + .progress-bar { + margin: 0px 30px; + position: relative; + .self-dot { + position: absolute; + height: 8px; + width: 6px; + z-index: 1; + background-color: yellowgreen; + cursor: pointer; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } + .label-dot { + position: absolute; + height: 8px; + width: 6px; + z-index: 1; + background-color: lightcoral; + cursor: pointer; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } + .el-slider { + margin: 15px 0; + + .el-slider__runway { + margin: 0; + height: 8px; + .el-slider__bar { + height: 8px; + } + .el-slider__button-wrapper { + width: 16px; + } + } + } + .el-slider__button { + width: 12px; + height: 12px; + } + .el-slider__stop { + background-color: lightcoral; + } + .time-clip { + width: 40px; + background-color: dimgray; + color: white; + display: none; + font-size: 12px; + top: -26px; + border-radius: 3px; + left: -20px; + height: 19px; + text-align: center; + line-height: 19px; + position: absolute; + } + } + .control-zone { + .time { + float: left; + margin-left: 23px; + } + .play-btn { + width: 200px; + height: 27px; + border-radius: 4px; + margin: 0 auto; + .group { + text-align: center; + .el-icon-d-arrow-left { + cursor: pointer; + margin-right: 20px; + font-size: 27px; + } + .el-icon-d-arrow-right { + cursor: pointer; + font-size: 27px; + margin-left: 20px; + } + } + } + } + } } } } .content-bottom { display: flex; + .bot-left { flex: 1; padding: 0px 15px 8px 15px; background: #fff; - border-radius: 3px; - .el-tabs__header { - padding: 0; - position: relative; - margin: 0 0 10px; -} + 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 { @@ -644,6 +1000,8 @@ .bot-right { width: 210px; margin-left: 10px; + min-width: 210px; + label { color: #999; padding-right: 8px; @@ -654,15 +1012,12 @@ .label-dialog { .el-dialog { width: 700px !important; - height: 558px !important; + height: 558px !important; .el-dialog__header { height: 20px; } p.label { line-height: 36px; - } - .label-radio { - padding: 20px; } .label-check { padding: 20px; -- Gitblit v1.8.0