Commit d87ff7bf4da6c8725a951dff96425192b5de5129

Authored by 648540858
1 parent 88d5b106

添加回放控制界面,优化录像查询接口

src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java
... ... @@ -56,17 +56,21 @@ public class GBRecordController {
56 56 }
57 57  
58 58 Device device = storager.queryVideoDevice(deviceId);
59   - cmder.recordInfoQuery(device, channelId, startTime, endTime);
60 59 // 指定超时时间 1分钟30秒
61 60 DeferredResult<ResponseEntity<RecordInfo>> result = new DeferredResult<>(90*1000L);
62 61 String uuid = UUID.randomUUID().toString();
63 62 String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId;
  63 + RequestMessage msg = new RequestMessage();
  64 + msg.setId(uuid);
  65 + msg.setKey(key);
  66 + cmder.recordInfoQuery(device, channelId, startTime, endTime, (eventResult -> {
  67 + msg.setData("查询录像失败, status: " + eventResult.statusCode + ", message: " + eventResult.msg );
  68 + resultHolder.invokeResult(msg);
  69 + }));
  70 +
64 71 // 录像查询以channelId作为deviceId查询
65 72 resultHolder.put(key, uuid, result);
66 73 result.onTimeout(()->{
67   - RequestMessage msg = new RequestMessage();
68   - msg.setId(uuid);
69   - msg.setKey(key);
70 74 msg.setData("timeout");
71 75 resultHolder.invokeResult(msg);
72 76 });
... ...
web_src/src/components/dialog/devicePlayer.vue
... ... @@ -39,7 +39,30 @@
39 39 </el-tab-pane>
40 40 <!--{"code":0,"data":{"paths":["22-29-30.mp4"],"rootPath":"/home/kkkkk/Documents/ZLMediaKit/release/linux/Debug/www/record/hls/kkkkk/2020-05-11/"}}-->
41 41 <el-tab-pane label="录像查询" name="record" v-if="showRrecord">
42   - <el-date-picker size="mini" v-model="videoHistory.date" type="date" value-format="yyyy-MM-dd" placeholder="日期" @change="queryRecords()"></el-date-picker>
  42 + <div style="float: left">
  43 + <span>录像控制</span>
  44 + <el-button-group style="margin-left: 1rem">
  45 + <el-button size="mini" class="iconfont icon-zanting" title="开始" @click="gbPause()"></el-button>
  46 + <el-button size="mini" class="iconfont icon-kaishi" title="暂停" @click="gbPlay()"></el-button>
  47 + <el-dropdown size="mini" title="播放倍速" @command="gbScale">
  48 + <el-button size="mini">
  49 + 倍速 <i class="el-icon-arrow-down el-icon--right"></i>
  50 + </el-button>
  51 + <el-dropdown-menu slot="dropdown">
  52 + <el-dropdown-item command="0.25">0.25倍速</el-dropdown-item>
  53 + <el-dropdown-item command="0.5">0.5倍速</el-dropdown-item>
  54 + <el-dropdown-item command="1.0">1倍速</el-dropdown-item>
  55 + <el-dropdown-item command="2.0">2倍速</el-dropdown-item>
  56 + <el-dropdown-item command="4.0">4倍速</el-dropdown-item>
  57 + </el-dropdown-menu>
  58 + </el-dropdown>
  59 + </el-button-group>
  60 + </div>
  61 + <el-date-picker size="mini" v-model="videoHistory.date" type="date" value-format="yyyy-MM-dd" placeholder="日期" @change="queryRecords()"></el-date-picker>
  62 + <div class="block" >
  63 + <span class="demonstration" style="padding: 12px 36px 12px 0;float: left;">{{Math.floor(seekTime * sliderTime / 100000)}}秒</span>
  64 + <el-slider style="width: 80%; float:left;" v-model="sliderTime" @change="gbSeek" :show-tooltip="false"></el-slider>
  65 + </div>
43 66 <el-table :data="videoHistory.searchHistoryResult" height="150" v-loading="recordsLoading">
44 67 <el-table-column label="名称" prop="name"></el-table-column>
45 68 <el-table-column label="文件" prop="filePath"></el-table-column>
... ... @@ -210,6 +233,8 @@ export default {
210 233 showPtz: true,
211 234 showRrecord: true,
212 235 tracksNotLoaded: false,
  236 + sliderTime: 0,
  237 + seekTime: 0,
213 238 };
214 239 },
215 240 methods: {
... ... @@ -433,6 +458,11 @@ export default {
433 458 },
434 459 playRecord: function (row) {
435 460 let that = this;
  461 +
  462 + let startTime = row.startTime
  463 + let endtime = row.endTime
  464 + this.seekTime = new Date(endtime).getTime() - new Date(startTime).getTime();
  465 + console.log(this.seekTime)
436 466 if (that.streamId != "") {
437 467 that.stopPlayRecord(function () {
438 468 that.streamId = "",
... ... @@ -580,7 +610,40 @@ export default {
580 610 }
581 611 console.log(resultArray)
582 612 return resultArray;
  613 + },
  614 + gbPlay(){
  615 + console.log('前端控制:播放');
  616 + this.$axios({
  617 + method: 'get',
  618 + url: '/api/playback/resume/' + this.streamId
  619 + }).then((res)=> {
  620 + this.$refs.videoPlayer.play(this.videoUrl)
  621 + });
  622 + },
  623 + gbPause(){
  624 + console.log('前端控制:暂停');
  625 + this.$axios({
  626 + method: 'get',
  627 + url: '/api/playback/pause/' + this.streamId
  628 + }).then(function (res) {});
  629 + },
  630 + gbScale(command){
  631 + console.log('前端控制:倍速 ' + command);
  632 + this.$axios({
  633 + method: 'get',
  634 + url: `/api/playback/speed/${this.streamId }/${command}`
  635 + }).then(function (res) {});
  636 + },
  637 + gbSeek(val){
  638 + console.log('前端控制:seek ');
  639 + console.log(this.seekTime);
  640 + console.log(this.sliderTime);
  641 + this.$axios({
  642 + method: 'get',
  643 + url: `/api/playback/seek/${this.streamId }/` + Math.floor(this.seekTime * val / 100000)
  644 + }).then(function (res) {});
583 645 }
  646 +
584 647 }
585 648 };
586 649 </script>
... ...
web_src/static/css/iconfont.css
1 1 @font-face {
2 2 font-family: "iconfont"; /* Project id 1291092 */
3   - src: url('iconfont.woff2?t=1631767887536') format('woff2'),
4   - url('iconfont.woff?t=1631767887536') format('woff'),
5   - url('iconfont.ttf?t=1631767887536') format('truetype');
  3 + src: url('iconfont.woff2?t=1637741914969') format('woff2'),
  4 + url('iconfont.woff?t=1637741914969') format('woff'),
  5 + url('iconfont.ttf?t=1637741914969') format('truetype');
6 6 }
7 7  
8 8 .iconfont {
... ... @@ -13,6 +13,226 @@
13 13 -moz-osx-font-smoothing: grayscale;
14 14 }
15 15  
  16 +.icon-suoxiao:before {
  17 + content: "\e79a";
  18 +}
  19 +
  20 +.icon-shanchu3:before {
  21 + content: "\e79b";
  22 +}
  23 +
  24 +.icon-chehui:before {
  25 + content: "\e79c";
  26 +}
  27 +
  28 +.icon-wenben:before {
  29 + content: "\e79d";
  30 +}
  31 +
  32 +.icon-zhongzuo:before {
  33 + content: "\e79e";
  34 +}
  35 +
  36 +.icon-jianqie:before {
  37 + content: "\e79f";
  38 +}
  39 +
  40 +.icon-fangda:before {
  41 + content: "\e7a0";
  42 +}
  43 +
  44 +.icon-fangdazhanshi:before {
  45 + content: "\e7a1";
  46 +}
  47 +
  48 +.icon-qianjin:before {
  49 + content: "\e7a2";
  50 +}
  51 +
  52 +.icon-kuaijin:before {
  53 + content: "\e7a3";
  54 +}
  55 +
  56 +.icon-diyigeshipin:before {
  57 + content: "\e7a4";
  58 +}
  59 +
  60 +.icon-kuaitui:before {
  61 + content: "\e7a5";
  62 +}
  63 +
  64 +.icon-kaishi:before {
  65 + content: "\e7a7";
  66 +}
  67 +
  68 +.icon-zuihouyigeshipin:before {
  69 + content: "\e7a8";
  70 +}
  71 +
  72 +.icon-zanting:before {
  73 + content: "\e7a9";
  74 +}
  75 +
  76 +.icon-zhankai:before {
  77 + content: "\e7aa";
  78 +}
  79 +
  80 +.icon-bendisucai:before {
  81 + content: "\e7ab";
  82 +}
  83 +
  84 +.icon-luzhi:before {
  85 + content: "\e7ac";
  86 +}
  87 +
  88 +.icon-ossziyuan:before {
  89 + content: "\e7ad";
  90 +}
  91 +
  92 +.icon-chuangjianzhinengfenxirenwu:before {
  93 + content: "\e7ae";
  94 +}
  95 +
  96 +.icon-sousuo3:before {
  97 + content: "\e7af";
  98 +}
  99 +
  100 +.icon-gengduo:before {
  101 + content: "\e7b0";
  102 +}
  103 +
  104 +.icon-tianjia:before {
  105 + content: "\e7b1";
  106 +}
  107 +
  108 +.icon-xiazai:before {
  109 + content: "\e7b2";
  110 +}
  111 +
  112 +.icon-biaojibeifen:before {
  113 + content: "\e7b3";
  114 +}
  115 +
  116 +.icon-bendisucaibeifen:before {
  117 + content: "\e7b4";
  118 +}
  119 +
  120 +.icon-luzhibeifen:before {
  121 + content: "\e7b5";
  122 +}
  123 +
  124 +.icon-ossziyuanbeifen:before {
  125 + content: "\e7b6";
  126 +}
  127 +
  128 +.icon-bianji3:before {
  129 + content: "\e7b7";
  130 +}
  131 +
  132 +.icon-cuti:before {
  133 + content: "\e7b8";
  134 +}
  135 +
  136 +.icon-xieti:before {
  137 + content: "\e7b9";
  138 +}
  139 +
  140 +.icon-xiahuaxian:before {
  141 + content: "\e7ba";
  142 +}
  143 +
  144 +.icon-wuxiaoguo:before {
  145 + content: "\e7bb";
  146 +}
  147 +
  148 +.icon-sousuo4:before {
  149 + content: "\e7bc";
  150 +}
  151 +
  152 +.icon-gouwuche:before {
  153 + content: "\e7bd";
  154 +}
  155 +
  156 +.icon-shuaxin2:before {
  157 + content: "\e7be";
  158 +}
  159 +
  160 +.icon-xiaoxi:before {
  161 + content: "\e7bf";
  162 +}
  163 +
  164 +.icon-wushouquan:before {
  165 + content: "\e7c0";
  166 +}
  167 +
  168 +.icon-tishi2:before {
  169 + content: "\e7c1";
  170 +}
  171 +
  172 +.icon-tishi1:before {
  173 + content: "\e7c2";
  174 +}
  175 +
  176 +.icon-shouquanchenggong:before {
  177 + content: "\e7c3";
  178 +}
  179 +
  180 +.icon-sousuo5:before {
  181 + content: "\e7c4";
  182 +}
  183 +
  184 +.icon-shuaxin3:before {
  185 + content: "\e7c5";
  186 +}
  187 +
  188 +.icon-xiazai1:before {
  189 + content: "\e7c6";
  190 +}
  191 +
  192 +.icon-shangchuan:before {
  193 + content: "\e7c7";
  194 +}
  195 +
  196 +.icon-guanbi:before {
  197 + content: "\e7c8";
  198 +}
  199 +
  200 +.icon-wangye-loading:before {
  201 + content: "\e7c9";
  202 +}
  203 +
  204 +.icon-bianzubeifen3:before {
  205 + content: "\e7ca";
  206 +}
  207 +
  208 +.icon-xingzhuangbeifen:before {
  209 + content: "\e7cb";
  210 +}
  211 +
  212 +.icon-bianzubeifen:before {
  213 + content: "\e7cc";
  214 +}
  215 +
  216 +.icon-zhuanchang:before {
  217 + content: "\e7cd";
  218 +}
  219 +
  220 +.icon-meizi:before {
  221 + content: "\e7ce";
  222 +}
  223 +
  224 +.icon-daimabeifen:before {
  225 + content: "\e7cf";
  226 +}
  227 +
  228 +.icon-suoxiao1:before {
  229 + content: "\e7d0";
  230 +}
  231 +
  232 +.icon-ai19:before {
  233 + content: "\e799";
  234 +}
  235 +
16 236 .icon-online:before {
17 237 content: "\e600";
18 238 }
... ...
web_src/static/css/iconfont.woff2
No preview for this file type