Prechádzať zdrojové kódy

feat(录像回放): 录像回放优化
1. 新增录像回放界面文件后缀显示
2. 新增录像文件根据格式筛选功能

kindring 1 rok pred
rodič
commit
d9b1e4b7ff
2 zmenil súbory, kde vykonal 538 pridanie a 437 odobranie
  1. 2 2
      web_src/config/index.js
  2. 536 435
      web_src/src/components/GBRecordDetail.vue

+ 2 - 2
web_src/config/index.js

@@ -3,8 +3,8 @@
 // see http://vuejs-templates.github.io/webpack for documentation.
 
 const path = require('path')
-const baseUrl = "https://127.0.0.1:19200"
-// const baseUrl = "https://hofuniot.cn:29072"
+// const baseUrl = "https://127.0.0.1:19200"
+const baseUrl = "https://hofuniot.cn:29072"
 const ZLMServer = "https://192.168.1.60:29010"
 module.exports = {
   dev: {

+ 536 - 435
web_src/src/components/GBRecordDetail.vue

@@ -1,35 +1,43 @@
 <template>
-	<div style="width: 100%">
-    <div class="page-header" >
+  <div style="width: 100%">
+    <div class="page-header">
       <div class="page-title">
         <el-page-header @back="goBack" content="国标录像"></el-page-header>
       </div>
     </div>
-		<el-container>
+    <el-container>
       <el-aside width="300px">
         <div class="record-list-box-box">
-          <el-date-picker size="mini" v-model="chooseDate" type="date" value-format="yyyy-MM-dd" placeholder="日期" @change="dateChange()"></el-date-picker>
+<!--          -->
+          <el-date-picker size="mini" v-model="chooseDate" type="date" value-format="yyyy-MM-dd" placeholder="日期"
+                          @change="dateChange()"></el-date-picker>
+<!--          格式选择 与日期选择框样式对其-->
+          <el-select style="width: 220px" v-model="filterExt" size="mini" @change="filterExtChangeHandle" placeholder="筛选格式">
+            <el-option
+                v-for="item in extList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+            </el-option>
+          </el-select>
           <div class="record-list-box" v-loading="recordsLoading" :style="recordListStyle">
-            <ul v-if="detailFiles.length >0" class="infinite-list record-list" >
-              <li v-for="item in detailFiles" class="infinite-list-item record-list-item" >
+            <ul v-if="detailFiles.length >0" class="infinite-list record-list">
+              <li v-for="item in detailFiles" class="infinite-list-item record-list-item">
 
-                <el-tag v-if="chooseFile != item" @click="checkedFile(item)">
-                  <i class="el-icon-video-camera"  ></i>
-                  {{ moment(item.startTime).format('HH:mm:ss')}}-{{ moment(item.endTime).format('HH:mm:ss')}}
+                <el-tag @click="checkedFile(item)" :type="chooseFile == item?'danger':''">
+                  <i class="el-icon-video-camera"></i>
+                  <span class="icon" :class="'icon-'+item.extName">{{item.extName}}</span>
+                  {{ moment(item.startTime).format('HH:mm:ss') }}-{{ moment(item.endTime).format('HH:mm:ss') }}
                 </el-tag>
-                <el-tag v-if="chooseFile == item" type="danger" >
-                  <i class="el-icon-video-camera"  ></i>
-                  {{ moment(item.startTime).format('HH:mm:ss')}}-{{ moment(item.endTime).format('HH:mm:ss')}}
-                </el-tag>
-                <i style="color: #409EFF;margin-left: 5px;" class="el-icon-download" @click="downloadRecord(item)" ></i>
+                <i style="color: #409EFF;margin-left: 5px;" class="el-icon-download" @click="downloadRecord(item)"></i>
               </li>
             </ul>
           </div>
-          <div size="mini" v-if="detailFiles.length ==0" class="record-list-no-val" >暂无数据</div>
+          <div size="mini" v-if="detailFiles.length ==0" class="record-list-no-val">暂无数据</div>
         </div>
 
       </el-aside>
-			<el-main style="padding-bottom: 10px;">
+      <el-main style="padding-bottom: 10px;">
         <div class="playBox" :style="playerStyle">
           <player ref="recordVideoPlayer"
                   :videoUrl="videoUrl"
@@ -37,33 +45,33 @@
                   :message="videoError"
                   :hasAudio="hasAudio"
                   style="max-height: 100%"
-                  fluent autoplay live ></player>
+                  fluent autoplay live></player>
         </div>
         <div class="player-option-box">
           <div>
-            <el-button-group >
+            <el-button-group>
               <el-time-picker
-                size="mini"
-                is-range
-                align="left"
-                v-model="timeRange"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                range-separator="至"
-                start-placeholder="开始时间"
-                end-placeholder="结束时间"
-                @change="timePickerChange"
-                placeholder="选择时间范围">
+                  size="mini"
+                  is-range
+                  align="left"
+                  v-model="timeRange"
+                  value-format="yyyy-MM-dd HH:mm:ss"
+                  range-separator="至"
+                  start-placeholder="开始时间"
+                  end-placeholder="结束时间"
+                  @change="timePickerChange"
+                  placeholder="选择时间范围">
               </el-time-picker>
             </el-button-group>
 
-            <el-button-group >
+            <el-button-group>
               <el-button size="mini" class="iconfont icon-zanting" title="开始" @click="gbPause()"></el-button>
               <el-button size="mini" class="iconfont icon-kaishi" title="暂停" @click="gbPlay()"></el-button>
-              <el-dropdown size="mini" title="播放倍速"  @command="gbScale">
+              <el-dropdown size="mini" title="播放倍速" @command="gbScale">
                 <el-button size="mini">
                   倍速 <i class="el-icon-arrow-down el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu  slot="dropdown">
+                <el-dropdown-menu slot="dropdown">
                   <el-dropdown-item command="0.25">0.25倍速</el-dropdown-item>
                   <el-dropdown-item command="0.5">0.5倍速</el-dropdown-item>
                   <el-dropdown-item command="1.0">1倍速</el-dropdown-item>
@@ -71,450 +79,543 @@
                   <el-dropdown-item command="4.0">4倍速</el-dropdown-item>
                 </el-dropdown-menu>
               </el-dropdown>
-              <el-button size="mini" class="iconfont icon-xiazai1" title="下载选定录像" @click="downloadRecord()"></el-button>
-              <el-button v-if="sliderMIn === 0 && sliderMax === 86400" size="mini" class="iconfont icon-slider" title="放大滑块" @click="setSliderFit()"></el-button>
-              <el-button v-if="sliderMIn !== 0 || sliderMax !== 86400" size="mini" class="iconfont icon-slider-right" title="恢复滑块" @click="setSliderFit()"></el-button>
+              <el-button size="mini" class="iconfont icon-xiazai1" title="下载选定录像"
+                         @click="downloadRecord()"></el-button>
+              <el-button v-if="sliderMIn === 0 && sliderMax === 86400" size="mini" class="iconfont icon-slider"
+                         title="放大滑块" @click="setSliderFit()"></el-button>
+              <el-button v-if="sliderMIn !== 0 || sliderMax !== 86400" size="mini" class="iconfont icon-slider-right"
+                         title="恢复滑块" @click="setSliderFit()"></el-button>
             </el-button-group>
           </div>
           <el-slider
-            class="playtime-slider"
-            v-model="playTime"
-            id="playtimeSlider"
-            :disabled="detailFiles.length === 0"
-            :min="sliderMIn"
-            :max="sliderMax"
-            :range="true"
-            :format-tooltip="playTimeFormat"
-            @change="playTimeChange"
-            :marks="playTimeSliderMarks">
+              class="playtime-slider"
+              v-model="playTime"
+              id="playtimeSlider"
+              :disabled="detailFiles.length === 0"
+              :min="sliderMIn"
+              :max="sliderMax"
+              :range="true"
+              :format-tooltip="playTimeFormat"
+              @change="playTimeChange"
+              :marks="playTimeSliderMarks">
           </el-slider>
           <div class="slider-val-box">
-            <div class="slider-val" v-for="item of detailFiles" :style="'width:' + getDataWidth(item) + '%; left:' + getDataLeft(item) + '%'"></div>
+            <div class="slider-val" v-for="item of detailFiles"
+                 :style="'width:' + getDataWidth(item) + '%; left:' + getDataLeft(item) + '%'"></div>
           </div>
         </div>
 
-			</el-main>
-		</el-container>
+      </el-main>
+    </el-container>
     <recordDownload ref="recordDownload"></recordDownload>
-	</div>
+  </div>
 </template>
 
 
 <script>
-	import uiHeader from '../layout/UiHeader.vue'
-  import player from './common/jessibuca.vue'
-  import moment  from 'moment'
-  import recordDownload from './dialog/recordDownload.vue'
-
-	export default {
-		name: 'app',
-		components: {
-			uiHeader, player,recordDownload
-		},
-		data() {
-			return {
-        deviceId: this.$route.params.deviceId,
-        channelId: this.$route.params.channelId,
-        recordsLoading: false,
-        streamId: "",
-        hasAudio: false,
-			  detailFiles: [],
-        chooseDate: null,
-        videoUrl: null,
-        chooseFile: null,
-        streamInfo: null,
-        app: null,
-        mediaServerId: null,
-        ssrc: null,
-
-        sliderMIn: 0,
-        sliderMax: 86400,
-        autoPlay: true,
-        taskUpdate: null,
-        tabVal: "running",
-        recordListStyle: {
-			    height: this.winHeight + "px",
-          overflow: "auto",
-          margin: "10px auto 10px auto"
-        },
-        playerStyle: {
-			    "margin": "0 auto 20px auto",
-          "height": this.winHeight + "px",
-        },
-        winHeight: window.innerHeight - 240,
-        playTime: null,
-        timeRange: null,
-        startTime: null,
-        endTime: null,
-        playTimeSliderMarks: {
-			    0: "00:00",
-			    3600: "01:00",
-			    7200: "02:00",
-			    10800: "03:00",
-			    14400: "04:00",
-			    18000: "05:00",
-			    21600: "06:00",
-			    25200: "07:00",
-			    28800: "08:00",
-			    32400: "09:00",
-			    36000: "10:00",
-          39600: "11:00",
-			    43200: "12:00",
-			    46800: "13:00",
-			    50400: "14:00",
-			    54000: "15:00",
-			    57600: "16:00",
-			    61200: "17:00",
-			    64800: "18:00",
-			    68400: "19:00",
-          72000: "20:00",
-			    75600: "21:00",
-			    79200: "22:00",
-			    82800: "23:00",
-          86400: "24:00",
-        },
-			};
-		},
-		computed: {
-
-		},
-		mounted() {
-      this.recordListStyle.height = this.winHeight + "px";
-      this.playerStyle["height"] = this.winHeight + "px";
-      this.chooseDate = moment().format('YYYY-MM-DD')
-      this.dateChange();
-
-		},
-    beforeDestroy() {
-      console.log('准备销毁页面')
-      this.stopPlayRecord();
-      this.stopDownloadRecord();
-    },
-    destroyed() {
-			this.$destroy('recordVideoPlayer');
-		},
-		methods: {
-      dateChange(){
-        if (!this.chooseDate) {
-          return;
+import uiHeader from '../layout/UiHeader.vue'
+import player from './common/jessibuca.vue'
+import moment from 'moment'
+import recordDownload from './dialog/recordDownload.vue'
+import handle from "@/until/handle";
+
+export default {
+  name: 'app',
+  components: {
+    uiHeader, player, recordDownload
+  },
+  data() {
+    return {
+      deviceId: this.$route.params.deviceId,
+      channelId: this.$route.params.channelId,
+      recordsLoading: false,
+      streamId: "",
+      hasAudio: false,
+      allDetailFiles: [],
+      // detailFiles: [],
+      chooseDate: null,
+      videoUrl: null,
+      chooseFile: null,
+      streamInfo: null,
+      app: null,
+      mediaServerId: null,
+      ssrc: null,
+      sliderMIn: 0,
+      sliderMax: 86400,
+      autoPlay: true,
+      taskUpdate: null,
+      tabVal: "running",
+      recordListStyle: {
+        height: this.winHeight + "px",
+        overflow: "auto",
+        margin: "10px auto 10px auto"
+      },
+      playerStyle: {
+        "margin": "0 auto 20px auto",
+        "height": this.winHeight + "px",
+      },
+      winHeight: window.innerHeight - 240,
+      playTime: null,
+      timeRange: null,
+      startTime: null,
+      endTime: null,
+      playTimeSliderMarks: {
+        0: "00:00",
+        3600: "01:00",
+        7200: "02:00",
+        10800: "03:00",
+        14400: "04:00",
+        18000: "05:00",
+        21600: "06:00",
+        25200: "07:00",
+        28800: "08:00",
+        32400: "09:00",
+        36000: "10:00",
+        39600: "11:00",
+        43200: "12:00",
+        46800: "13:00",
+        50400: "14:00",
+        54000: "15:00",
+        57600: "16:00",
+        61200: "17:00",
+        64800: "18:00",
+        68400: "19:00",
+        72000: "20:00",
+        75600: "21:00",
+        79200: "22:00",
+        82800: "23:00",
+        86400: "24:00",
+      },
+      extList: [],
+      filterExt: null,
+    };
+  },
+  computed: {
+    detailFiles() {
+      let ext = this.filterExt;
+      if(!ext){
+        return this.allDetailFiles;
+      }
+      if(ext === 'all') {
+        return this.allDetailFiles;
+      }
+      return this.allDetailFiles.filter((item) => {
+        return item.extName === ext;
+      })
+    }
+  },
+  mounted() {
+    this.recordListStyle.height = this.winHeight + "px";
+    this.playerStyle["height"] = this.winHeight + "px";
+    this.chooseDate = moment().format('YYYY-MM-DD')
+    this.dateChange();
+  },
+  beforeDestroy() {
+    console.log('准备销毁页面')
+    this.stopPlayRecord();
+    this.stopDownloadRecord();
+  },
+  destroyed() {
+    this.$destroy('recordVideoPlayer');
+  },
+  methods: {
+    async dateChange() {
+      let err, res;
+      let recordList = [];
+      if (!this.chooseDate) {
+        return;
+      }
+
+      this.setTime(this.chooseDate + " 00:00:00", this.chooseDate + " 23:59:59");
+      this.recordsLoading = true;
+      this.detailFiles = [];
+      let url = '/api/gb_record/query/'
+      url += `${this.deviceId}/${this.channelId}`;
+      url += `?startTime=${this.startTime}`;
+      url += `&endTime=${this.endTime}`;
+      [err, res] = await handle(this.$axios.axios({
+        method: 'get',
+        url: url
+      }))
+      this.recordsLoading = false;
+      if (err) {
+        this.$message({
+          showClose: true,
+          message: err.message,
+          type: "error",
+        });
+        return;
+      }
+      if (res.data.code !== 0) {
+        this.$message({
+          showClose: true,
+          message: res.data.msg,
+          type: "error",
+        });
+      }
+      // 创建一个set集合
+      let extSet = new Set();
+      recordList = res.data.data.recordList;
+      // 遍历获取文件后缀名
+      recordList.forEach((item) => {
+        // item.name = item.fileName;
+        item.extName = this.getExtName(item.name);
+        extSet.add(item.extName);
+      })
+      this.allDetailFiles = recordList;
+      // 将set集合转换为数组
+
+      this.extList = Array.from(extSet).map((item) => {
+        return {
+          label: item,
+          value: item
         }
+      });
+      // 首位添加 所有格式
+      this.extList.unshift({
+        label: "所有格式",
+        value: "all"
+      });
+      this.filterExt = "all";
+      console.log(this.detailFiles);
+    },
+    getExtName(fileName){
+      let tmpSplit = fileName.split(".");
+      let extName = tmpSplit[tmpSplit.length - 1];
+      return extName;
+    },
+    moment: function (v) {
+      return moment(v)
+    },
+    setTime: function (startTime, endTime) {
+      this.startTime = startTime;
+      this.endTime = endTime;
+      let start = (new Date(this.startTime).getTime() - new Date(this.chooseDate + " 00:00:00").getTime()) / 1000;
+      let end = (new Date(this.endTime).getTime() - new Date(this.chooseDate + " 00:00:00").getTime()) / 1000;
+      console.log(start)
+      console.log(end)
+      this.playTime = [start, end];
+      this.timeRange = [startTime, endTime];
+    },
+    videoError: function (e) {
+      console.log("播放器错误:" + JSON.stringify(e));
+    },
+    checkedFile(file) {
+      this.chooseFile = file;
+      this.setTime(file.startTime, file.endTime);
+      // 开始回放
+      this.playRecord()
+    },
+    playRecord: function () {
 
-        this.setTime(this.chooseDate + " 00:00:00", this.chooseDate + " 23:59:59");
-        this.recordsLoading = true;
-        this.detailFiles = [];
+      if (this.streamId !== "") {
+        this.stopPlayRecord(() => {
+          this.streamId = "";
+          this.playRecord();
+        })
+      } else {
         this.$axios.axios({
           method: 'get',
-          url: '/api/gb_record/query/' + this.deviceId + '/' + this.channelId + '?startTime=' + this.startTime + '&endTime=' + this.endTime
-        }).then((res)=>{
-          this.recordsLoading = false;
-          if(res.data.code === 0) {
-            // 处理时间信息
-            this.detailFiles = res.data.data.recordList;
-
-          }else {
+          url: '/api/playback/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + this.startTime + '&endTime=' +
+              this.endTime
+        }).then((res) => {
+          if (res.data.code === 0) {
+            this.streamInfo = res.data.data;
+            this.app = this.streamInfo.app;
+            this.streamId = this.streamInfo.stream;
+            this.mediaServerId = this.streamInfo.mediaServerId;
+            this.ssrc = this.streamInfo.ssrc;
+            this.videoUrl = this.getUrlByStreamInfo();
+          } else {
             this.$message({
               showClose: true,
               message: res.data.msg,
               type: "error",
             });
           }
-
-        }).catch((e)=> {
-          this.recordsLoading = false;
-          // that.videoHistory.searchHistoryResult = falsificationData.recordData;
         });
-      },
-      moment: function (v) {
-        return moment(v)
-      },
-      setTime: function (startTime, endTime){
-        this.startTime = startTime;
-        this.endTime = endTime;
-        let start = (new Date(this.startTime).getTime() - new Date(this.chooseDate + " 00:00:00").getTime())/1000;
-        let end = (new Date(this.endTime).getTime() - new Date(this.chooseDate + " 00:00:00").getTime())/1000;
-        console.log(start)
-        console.log(end)
-        this.playTime = [start, end];
-        this.timeRange = [startTime, endTime];
-      },
-      videoError: function (e) {
-        console.log("播放器错误:" + JSON.stringify(e));
-      },
-      checkedFile(file){
-        this.chooseFile = file;
-        this.setTime(file.startTime, file.endTime);
-			  // 开始回放
-        this.playRecord()
-      },
-      playRecord: function () {
-
-        if (this.streamId !== "") {
-          this.stopPlayRecord(()=> {
-            this.streamId = "";
-            this.playRecord();
-          })
-        } else {
-          this.$axios.axios({
-            method: 'get',
-            url: '/api/playback/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + this.startTime + '&endTime=' +
-              this.endTime
-          }).then((res)=> {
-            if (res.data.code === 0) {
-              this.streamInfo = res.data.data;
-              this.app = this.streamInfo.app;
-              this.streamId = this.streamInfo.stream;
-              this.mediaServerId = this.streamInfo.mediaServerId;
-              this.ssrc = this.streamInfo.ssrc;
-              this.videoUrl = this.getUrlByStreamInfo();
-            }else {
-              this.$message({
-                showClose: true,
-                message: res.data.msg,
-                type: "error",
-              });
-            }
-          });
+      }
+    },
+    gbPlay() {
+      console.log('前端控制:播放');
+      this.$axios.axios({
+        method: 'get',
+        url: '/api/playback/resume/' + this.streamId
+      }).then((res) => {
+        this.$refs["recordVideoPlayer"].play(this.videoUrl)
+      });
+    },
+    gbPause() {
+      console.log('前端控制:暂停');
+      this.$axios.axios({
+        method: 'get',
+        url: '/api/playback/pause/' + this.streamId
+      }).then(function (res) {
+      });
+    },
+    gbScale(command) {
+      console.log('前端控制:倍速 ' + command);
+      this.$axios.axios({
+        method: 'get',
+        url: `/api/playback/speed/${this.streamId}/${command}`
+      }).then(function (res) {
+      });
+    },
+    downloadRecord: function (row) {
+      if (!row) {
+        let startTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + this.playTime[0] * 1000).format("YYYY-MM-DD HH:mm:ss");
+        let endTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + this.playTime[1] * 1000).format("YYYY-MM-DD HH:mm:ss");
+        console.log(startTimeStr);
+        console.log(endTimeStr);
+        row = {
+          startTime: startTimeStr,
+          endTime: endTimeStr
         }
-      },
-      gbPlay(){
-        console.log('前端控制:播放');
-        this.$axios.axios({
-          method: 'get',
-          url: '/api/playback/resume/' + this.streamId
-        }).then((res)=> {
-          this.$refs["recordVideoPlayer"].play(this.videoUrl)
-        });
-      },
-      gbPause(){
-        console.log('前端控制:暂停');
-        this.$axios.axios({
-          method: 'get',
-          url: '/api/playback/pause/' + this.streamId
-        }).then(function (res) {});
-      },
-      gbScale(command){
-        console.log('前端控制:倍速 ' + command);
+      }
+      if (this.streamId !== "") {
+        this.stopPlayRecord(() => {
+          this.streamId = "";
+          this.downloadRecord(row);
+        })
+      } else {
         this.$axios.axios({
           method: 'get',
-          url: `/api/playback/speed/${this.streamId }/${command}`
-        }).then(function (res) {});
-      },
-      downloadRecord: function (row) {
-        if (!row) {
-          let startTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + this.playTime[0]*1000).format("YYYY-MM-DD HH:mm:ss");
-          let endTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + this.playTime[1]*1000).format("YYYY-MM-DD HH:mm:ss");
-          console.log(startTimeStr);
-          console.log(endTimeStr);
-          row = {
-            startTime: startTimeStr,
-            endTime: endTimeStr
-          }
-        }
-        if (this.streamId !== "") {
-          this.stopPlayRecord(()=> {
-            this.streamId = "";
-            this.downloadRecord(row);
-          })
-        }else {
-          this.$axios.axios({
-            method: 'get',
-            url: '/api/gb_record/download/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + row.startTime + '&endTime=' +
+          url: '/api/gb_record/download/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + row.startTime + '&endTime=' +
               row.endTime + '&downloadSpeed=4'
-          }).then( (res)=> {
-            if (res.data.code === 0) {
-              let streamInfo = res.data.data;
-              this.$refs.recordDownload.openDialog(this.deviceId, this.channelId, streamInfo.app, streamInfo.stream, streamInfo.mediaServerId);
-            }else {
-              this.$message({
-                showClose: true,
-                message: res.data.msg,
-                type: "error",
-              });
-            }
-          });
-        }
-      },
-      stopDownloadRecord: function (callback) {
-        this.$refs["recordVideoPlayer"].pause();
-        this.videoUrl = '';
-        this.$axios.axios({
-          method: 'get',
-          url: '/api/gb_record/download/stop/' + this.deviceId + "/" + this.channelId+ "/" + this.streamId
-        }).then((res)=> {
-          if (callback) callback(res)
-        });
-      },
-      stopPlayRecord: function (callback) {
-        this.$refs["recordVideoPlayer"].pause();
-        this.videoUrl = '';
-        this.$axios.axios({
-          method: 'get',
-          url: '/api/playback/stop/' + this.deviceId + "/" + this.channelId + "/" + this.streamId
-        }).then(function (res) {
-          if (callback) callback()
+        }).then((res) => {
+          if (res.data.code === 0) {
+            let streamInfo = res.data.data;
+            this.$refs.recordDownload.openDialog(this.deviceId, this.channelId, streamInfo.app, streamInfo.stream, streamInfo.mediaServerId);
+          } else {
+            this.$message({
+              showClose: true,
+              message: res.data.msg,
+              type: "error",
+            });
+          }
         });
-      },
-      getDataWidth(item){
-        let timeForFile = this.getTimeForFile(item);
-        let result = (timeForFile[2])/((this.sliderMax - this.sliderMIn)*1000)
-        return result*100
-      },
-      getDataLeft(item){
-        let timeForFile = this.getTimeForFile(item);
-        let differenceTime = timeForFile[0].getTime() - new Date(this.chooseDate + " 00:00:00").getTime()
-        return parseFloat((differenceTime - this.sliderMIn * 1000)/((this.sliderMax - this.sliderMIn)*1000))*100   ;
-      },
-      getUrlByStreamInfo(){
-        if (location.protocol === "https:") {
-          this.videoUrl = this.streamInfo["wss_flv"]
-        }else {
-          this.videoUrl = this.streamInfo["ws_flv"]
-        }
-        return this.videoUrl;
+      }
+    },
+    stopDownloadRecord: function (callback) {
+      this.$refs["recordVideoPlayer"].pause();
+      this.videoUrl = '';
+      this.$axios.axios({
+        method: 'get',
+        url: '/api/gb_record/download/stop/' + this.deviceId + "/" + this.channelId + "/" + this.streamId
+      }).then((res) => {
+        if (callback) callback(res)
+      });
+    },
+    stopPlayRecord: function (callback) {
+      this.$refs["recordVideoPlayer"].pause();
+      this.videoUrl = '';
+      this.$axios.axios({
+        method: 'get',
+        url: '/api/playback/stop/' + this.deviceId + "/" + this.channelId + "/" + this.streamId
+      }).then(function (res) {
+        if (callback) callback()
+      });
+    },
+    getDataWidth(item) {
+      let timeForFile = this.getTimeForFile(item);
+      let result = (timeForFile[2]) / ((this.sliderMax - this.sliderMIn) * 1000)
+      return result * 100
+    },
+    getDataLeft(item) {
+      let timeForFile = this.getTimeForFile(item);
+      let differenceTime = timeForFile[0].getTime() - new Date(this.chooseDate + " 00:00:00").getTime()
+      return parseFloat((differenceTime - this.sliderMIn * 1000) / ((this.sliderMax - this.sliderMIn) * 1000)) * 100;
+    },
+    getUrlByStreamInfo() {
+      if (location.protocol === "https:") {
+        this.videoUrl = this.streamInfo["wss_flv"]
+      } else {
+        this.videoUrl = this.streamInfo["ws_flv"]
+      }
+      return this.videoUrl;
 
-      },
-      timePickerChange: function (val){
-        this.setTime(val[0], val[1])
-      },
-      playTimeChange(val){
-        console.log(val)
+    },
+    timePickerChange: function (val) {
+      this.setTime(val[0], val[1])
+    },
+    playTimeChange(val) {
+      console.log(val)
 
-        let startTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + val[0]*1000).format("YYYY-MM-DD HH:mm:ss");
-        let endTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + val[1]*1000).format("YYYY-MM-DD HH:mm:ss");
+      let startTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + val[0] * 1000).format("YYYY-MM-DD HH:mm:ss");
+      let endTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + val[1] * 1000).format("YYYY-MM-DD HH:mm:ss");
 
-        this.setTime(startTimeStr, endTimeStr)
+      this.setTime(startTimeStr, endTimeStr)
 
-        this.playRecord();
-      },
-      setSliderFit() {
-        if (this.sliderMIn === 0 && this.sliderMax === 86400) {
-          if (this.detailFiles.length > 0){
-            let timeForFile = this.getTimeForFile(this.detailFiles[0]);
-            let lastTimeForFile = this.getTimeForFile(this.detailFiles[this.detailFiles.length - 1]);
-            let timeNum = timeForFile[0].getTime() - new Date(this.chooseDate + " " + "00:00:00").getTime()
-            let lastTimeNum = lastTimeForFile[1].getTime() - new Date(this.chooseDate + " " + "00:00:00").getTime()
-
-            this.playTime = parseInt(timeNum/1000)
-            this.sliderMIn = parseInt(timeNum/1000 - timeNum/1000%(60*60))
-            this.sliderMax = parseInt(lastTimeNum/1000 - lastTimeNum/1000%(60*60)) + 60*60
-
-            this.playTime = [this.sliderMIn, this.sliderMax];
-          }
-        }else {
-          this.sliderMIn = 0;
-          this.sliderMax = 86400;
-        }
-      },
-      getTimeForFile(file){
-        let startTime = new Date(file.startTime);
-        let endTime = new Date(file.endTime);
-        return [startTime, endTime, endTime.getTime() - startTime.getTime()];
-      },
-      playTimeFormat(val){
-        let h = parseInt(val/3600);
-        let m = parseInt((val - h*3600)/60);
-        let s = parseInt(val - h*3600 - m*60);
-
-        let hStr = h;
-        let mStr = m;
-        let sStr = s;
-        if (h < 10) {
-          hStr = "0" + hStr;
-        }
-        if (m < 10) {
-          mStr = "0" + mStr;s
-        }
-        if (s < 10) {
-          sStr = "0" + sStr;
+      this.playRecord();
+    },
+    setSliderFit() {
+      if (this.sliderMIn === 0 && this.sliderMax === 86400) {
+        if (this.detailFiles.length > 0) {
+          let timeForFile = this.getTimeForFile(this.detailFiles[0]);
+          let lastTimeForFile = this.getTimeForFile(this.detailFiles[this.detailFiles.length - 1]);
+          let timeNum = timeForFile[0].getTime() - new Date(this.chooseDate + " " + "00:00:00").getTime()
+          let lastTimeNum = lastTimeForFile[1].getTime() - new Date(this.chooseDate + " " + "00:00:00").getTime()
+
+          this.playTime = parseInt(timeNum / 1000)
+          this.sliderMIn = parseInt(timeNum / 1000 - timeNum / 1000 % (60 * 60))
+          this.sliderMax = parseInt(lastTimeNum / 1000 - lastTimeNum / 1000 % (60 * 60)) + 60 * 60
+
+          this.playTime = [this.sliderMIn, this.sliderMax];
         }
-        return hStr + ":" + mStr + ":" + sStr
-      },
-      goBack(){
-        window.history.go(-1);
+      } else {
+        this.sliderMIn = 0;
+        this.sliderMax = 86400;
       }
-		}
-	};
-</script>
+    },
+    getTimeForFile(file) {
+      let startTime = new Date(file.startTime);
+      let endTime = new Date(file.endTime);
+      return [startTime, endTime, endTime.getTime() - startTime.getTime()];
+    },
+    playTimeFormat(val) {
+      let h = parseInt(val / 3600);
+      let m = parseInt((val - h * 3600) / 60);
+      let s = parseInt(val - h * 3600 - m * 60);
 
-<style>
-  .el-slider__runway {
-    background-color:rgba(206, 206, 206, 0.47) !important;
-  }
-  .el-slider__bar {
-    background-color: rgba(153, 153, 153, 0) !important;
-  }
-  .playtime-slider {
-    position: relative;
-    z-index: 100;
-  }
-  .data-picker-true{
+      let hStr = h;
+      let mStr = m;
+      let sStr = s;
+      if (h < 10) {
+        hStr = "0" + hStr;
+      }
+      if (m < 10) {
+        mStr = "0" + mStr;
+        s
+      }
+      if (s < 10) {
+        sStr = "0" + sStr;
+      }
+      return hStr + ":" + mStr + ":" + sStr
+    },
+    goBack() {
+      window.history.go(-1);
+    },
+    filterExtChangeHandle(){
+      let ext = this.filterExt;
+      if(!ext){
+        return
+      }
+      if(ext === 'all') {
+        this.detailFiles = this.detailFiles;
+      }
 
+    }
   }
-  .data-picker-true:after{
-    content: "";
-    position: absolute;
-    width: 4px;
-    height: 4px;
-    background-color: #606060;
-    border-radius: 4px;
-    left: 45%;
-    top: 74%;
+};
+</script>
+<style scoped>
+.icon{
+  font-size: 12px;
+  margin-right: 5px;
+}
+.icon-mp4{
+  color: #25cb8e;
+}
+.icon-h265{
+  color: #ef7b05;
+}
+.icon-h264{
+  color: #407300;
+}
+</style>
+<style>
+.el-slider__runway {
+  background-color: rgba(206, 206, 206, 0.47) !important;
+}
 
-  }
-  .data-picker-false{
+.el-slider__bar {
+  background-color: rgba(153, 153, 153, 0) !important;
+}
 
-  }
-  .slider-val-box{
-    height: 6px;
-    position: relative;
-    top: -22px;
-  }
-  .slider-val{
-    height: 6px;
-    background-color: #007CFF;
-    position: absolute;
-  }
-  .record-list-box-box{
-    width: 250px;
-    float: left;
-  }
-  .record-list-box{
-    overflow: auto;
-    width: 220px;
-    list-style: none;
-    padding: 0;
-    margin: 0;
-    margin-top: 0px;
-    padding: 1rem 0;
-    background-color: #FFF;
-    margin-top: 10px;
-  }
-  .record-list{
-    list-style: none;
-    padding: 0;
-    margin: 0;
-    background-color: #FFF;
+.playtime-slider {
+  position: relative;
+  z-index: 100;
+}
 
-  }
-  .record-list-no-val {
-    position: absolute;
-    color: #9f9f9f;
-    top: 50%;
-    left: 110px;
-  }
-  .record-list-item{
-    padding: 0;
-    margin: 0;
-    margin: 0.5rem 0;
-    cursor: pointer;
-  }
-  .record-list-option {
-    width: 10px;
-    float: left;
-    margin-top: 39px;
+.data-picker-true {
 
-  }
-  .player-option-box{
-    padding: 0 20px;
-  }
+}
+
+.data-picker-true:after {
+  content: "";
+  position: absolute;
+  width: 4px;
+  height: 4px;
+  background-color: #606060;
+  border-radius: 4px;
+  left: 45%;
+  top: 74%;
+
+}
+
+.data-picker-false {
+
+}
+
+.slider-val-box {
+  height: 6px;
+  position: relative;
+  top: -22px;
+}
+
+.slider-val {
+  height: 6px;
+  background-color: #007CFF;
+  position: absolute;
+}
+
+.record-list-box-box {
+  width: 250px;
+  float: left;
+}
+
+.record-list-box {
+  overflow: auto;
+  width: 220px;
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  margin-top: 0px;
+  padding: 1rem 0;
+  background-color: #FFF;
+  margin-top: 10px;
+}
+
+.record-list {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  background-color: #FFF;
+
+}
+
+.record-list-no-val {
+  position: absolute;
+  color: #9f9f9f;
+  top: 50%;
+  left: 110px;
+}
+
+.record-list-item {
+  padding: 0;
+  margin: 0;
+  margin: 0.5rem 0;
+  cursor: pointer;
+}
+
+.record-list-option {
+  width: 10px;
+  float: left;
+  margin-top: 39px;
+
+}
+
+.player-option-box {
+  padding: 0 20px;
+}
 </style>