Преглед на файлове

[FE]:视频监控界面流媒体完成

xiayu3 преди 4 години
родител
ревизия
26f78ba0b9

+ 1 - 2
security-protection-platform/src/components/VideoPlayer/index.vue

@ -34,8 +34,7 @@ const defaultPlayerOptions = {
34 34
        name: 'volumePanel', // 音量控制
35 35
        inline: true // 不使用水平方式
36 36
      },
37
      {name: 'FullscreenToggle'}, // 全屏
38
      {name: 'FullscreenToggle'}
37
      {name: 'FullscreenToggle'} // 全屏
39 38
    ]
40 39
  }
41 40
}

+ 1 - 30
security-protection-platform/src/modules/system/assignment/index.vue

@ -103,8 +103,6 @@ export default {
103 103
    }
104 104
  },
105 105
  created () {
106
    this.getDeviceData()
107
    this.getDeviceTypes()
108 106
    this.getTaskName()
109 107
    this.getmatchingType()
110 108
  },
@ -116,6 +114,7 @@ export default {
116 114
    },
117 115
    getmatchingType() {
118 116
      sysapi.getCharSpecList('AI_MATCHER_MODE').then(res => {
117
        console.log(res);
119 118
        this.matchingTypeList = res.data
120 119
      })
121 120
    },
@ -132,34 +131,6 @@ export default {
132 131
      }
133 132
      return typecellClass
134 133
    },
135
    // 获取设备列表数据
136
    async getDeviceData () {
137
      const res = await sysapi.getDeviceData({ params: { page: this.page, limit: this.limit, taskName: this.taskName, matchingType: this.matchingType, taskStatus: this.taskStatus } }
138
      )
139
      if (res.status === 200) {
140
        const list = res.data.data.data
141
        let dataList = list.map(item => {
142
          return {
143
            taskName: item.deviceName,
144
            status: item.deviceType
145
          }
146
        })
147
        console.log(dataList)
148
        this.taskDataList = dataList
149
        this.total = res.data.total
150
      } else {
151
        this.$Message.danger('设备数据列表获取失败!')
152
      }
153
    },
154
    // 向服务器发送请求获取设备类型列表数据
155
    async getDeviceTypes () {
156
      const res = await sysapi.getDeviceTypes()
157
      if (res.status === 200) {
158
        this.taskNameList = res.data.data
159
      } else {
160
        this.$Message.danger('设备类型列表数据获取失败!')
161
      }
162
    },
163 134
    // 查询数据
164 135
    selectHandle () {
165 136
      this.page = 1

+ 7 - 5
security-protection-platform/src/modules/videoSurveillance/components/rtmpVideoPlay/index.vue

@ -62,9 +62,15 @@ export default {
62 62
    }
63 63
  },
64 64
  methods: {
65
    // 初始化
65 66
    handlePlayerInited(player) {
66 67
      this.$player = player
67 68
      window.player = this
69
      var myButton = player.controlBar.addChild('button')
70
      myButton.addClass('vjs-play-control')
71
      myButton.on('click', () => {
72
        this.$emit('videoReplay')
73
      })
68 74
    },
69 75
    async handleTabChange(name, index) {
70 76
      this.$player.pause()
@ -79,7 +85,6 @@ export default {
79 85
    resetVideoList() {
80 86
      const videoList = this.list.map((item, index) => {
81 87
        const { fileId, fileType } = item
82
        console.log(fileType)
83 88
        return {
84 89
          index,
85 90
          fileId,
@ -136,10 +141,7 @@ export default {
136 141
      // fake
137 142
      return new Promise((resolve, reject) => {
138 143
        setTimeout(() => {
139
          const x = Math.random()
140
          const url = x > 0.5
141
            ? 'http://10.19.90.34:19000/tool-image/tool-image_7d359725fac4464fb248284caf321993.mp4'
142
            : 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4'
144
          const url = 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1'
143 145
          resolve({
144 146
            url
145 147
          })

+ 107 - 86
security-protection-platform/src/modules/videoSurveillance/index.vue

@ -13,76 +13,32 @@
13 13
      </t-select>
14 14
    </div>
15 15
    <div class="page-bottom">
16
      <!-- <div v-for="(item,index) in videoList" :key="index">
17
        <t-card class="card-video">
18
          <img :src="item.url" class="card-image">
19
          <div slot="foot" class="bottom">
20
            <span v-tooltip="item.videoDetail">{{ item.videoDetail.content | handleText }}</span>
21
            <div style="margin-left:auto">
22
              <t-button v-tooltip="item.options1" class="bottom-btn" @click="goDistinguishRecord(item.videoId)">
23
                <t-icon size="16" icon="image-outline"></t-icon>
24
              </t-button>
25
              <t-button v-tooltip="item.options2" class="bottom-btn" @click="handleReview(item.videoId)">
26
                <t-icon size="16" icon="piechart-outline"></t-icon>
27
              </t-button>
28
              <t-button v-tooltip="item.options3" class="bottom-btn">
29
                <t-icon size="16" icon="arrow-expand-all-outline"></t-icon>
30
              </t-button>
31
            </div>
32
          </div>
33
        </t-card>
16
      <!-- <div v-for="(item,index) in videoList" :key="index" :value="item.id" style="width:400px;margin:24px 0px 0 24px;">
17
        <rtmp-video :list="replayList" @videoReplay="handleReview"></rtmp-video>
34 18
      </div> -->
35
      <div style="width:400px;margin:24px 24px 0 0;">
36
        <!-- <video id="videoPlayer" class="video-js vjs-default-skin vjs-big-play-centered"
37
               controls autoplay preload="auto" width="640" height="360"
38
               data-setup="{ &quot;html5&quot; : { &quot;nativeTextTracks&quot; : false } }">
39
          <source src="rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1" type="rtmp/flv" />
40
        </video> -->
19
      <div style="width:400px;margin:24px 0px 0 24px;">
20
        <rtmp-video :list="replayList" @videoReplay="handleReview"></rtmp-video>
41 21
      </div>
42 22
    </div>
43 23
    <t-pager :page-size="videoPageSize" :current="videoCurrent" :total="videoTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
44
    <replay-dialog :list="replayList" />
24
    <replay-dialog :list="replayList" :visibled.sync="showReplayDialog"/>
45 25
  </div>
46 26
</template>
47 27
<script>
48 28
import sysapi from '@/api/videoSurveillance'
49
import commonapi from '@/api/common'
50
import ReplayDialog from './components/rtmpVideoPlay'
29
import RtmpVideo from './components/rtmpVideoPlay'
30
import ReplayDialog from './components/ReplayDialog'
51 31
import VideoPlayer from '@/components/VideoPlayer'
52 32
import videojs from 'video.js'
53 33
window.videojs = videojs
34
54 35
require('videojs-flash')
55 36
require('videojs-playlist')
56 37
require('video.js/dist/lang/zh-CN.js')
57 38
require('video.js/dist/video-js.min.css')
58 39
59
const defaultPlayerOptions = {
60
  controls: true,
61
  autoplay: false,
62
  muted: false,
63
  language: 'zh-CN',
64
  fluid: true,
65
  // liveui: true,
66
  controlBar: {
67
    children: [
68
      {name: 'playToggle'}, // 播放按钮
69
      {name: 'currentTimeDisplay'}, // 当前已播放时间
70
      {name: 'progressControl'}, // 播放进度条
71
      {name: 'durationDisplay'}, // 总时间
72
      { // 倍数播放
73
        name: 'playbackRateMenuButton',
74
        playbackRates: [0.5, 1, 1.5, 2, 2.5]
75
      },
76
      {
77
        name: 'volumePanel', // 音量控制
78
        inline: false // 不使用水平方式
79
      },
80
      {name: 'FullscreenToggle'} // 全屏
81
    ]
82
  }
83
}
84 40
export default {
85
  components: { ReplayDialog, VideoPlayer },
41
  components: { ReplayDialog, VideoPlayer, RtmpVideo },
86 42
  filters: {
87 43
    handleText (value) {
88 44
      if (!value) return ''
@ -93,9 +49,7 @@ export default {
93 49
    }
94 50
  },
95 51
  data () {
96
    const playerOptions = Object.assign({}, defaultPlayerOptions, this.options)
97 52
    return {
98
      playerOptions,
99 53
      videoCurrent: 1, // 大门分页数据
100 54
      videoPageSize: 10, // 大门分页数据
101 55
      videoTotal: 100, // 大门分页总数
@ -106,24 +60,94 @@ export default {
106 60
      },
107 61
      organizationList: [], // 风场数据
108 62
      gateFieldData: 101101,
109
      videoList: [],
63
      videoList: [], // 场景数据列表
110 64
      sceneList: [], // 场景列表
111 65
      totalList: [], // 所有风场数据列表
112
      selectedMonitorScene: '',
113
      showReplayDialog: true,
66
      selectedMonitorScene: '', // 当前选择场景
67
      videoPlayList: [],
68
      showReplayDialog: false,
114 69
      replayList: []
115 70
    }
116 71
  },
117 72
  mounted () {
118
    // var myButton = videojs.player.controlBar.addChild('button', {
119
    //   text: 'Press me'
120
    //   // other options
121
    // })
122
    // myButton.addClass('html-classname')
123 73
    this.getWindFiledList() // 获取风场列表
124
    this.handleReview()
74
    this.getdata()
125 75
  },
126 76
  methods: {
77
    getdata() {
78
      this.replayList = [{
79
        fileName: '12月14 16:55',
80
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
81
        fileType: 'rtmp/flv'
82
      }, {
83
        fileName: '12月14 16:56',
84
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
85
        fileType: 'rtmp/flv'
86
      }, {
87
        fileName: '12月14 16:57',
88
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
89
        fileType: 'rtmp/flv'
90
      }, {
91
        fileName: '12月14 16:58',
92
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
93
        fileType: 'rtmp/flv'
94
      }, {
95
        fileName: '12月14 16:59',
96
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
97
        fileType: 'rtmp/flv'
98
      }, {
99
        fileName: '12月14 17:00',
100
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
101
        fileType: 'rtmp/flv'
102
      }]
103
      this.replayList = [{
104
        sources: [{
105
          src: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
106
          type: 'rtmp/flv'
107
        }]
108
      }, {
109
        sources: [{
110
          src: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
111
          type: 'rtmp/flv'
112
        }]
113
      }]
114
      this.videoPlayList = [{
115
        fileName: '12月14 16:55',
116
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
117
        fileType: 'rtmp/flv'
118
      }, {
119
        fileName: '12月14 16:56',
120
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
121
        fileType: 'rtmp/flv'
122
      }, {
123
        fileName: '12月14 16:57',
124
        fileId: 'ai-video_5A02296PAKA885B-video20201214165528.mp4',
125
        fileType: 'rtmp/flv'
126
      }, {
127
        fileName: '12月14 16:58',
128
        fileId: 'ai-video_5A02296PAKA885B-video20201214165529.mp4',
129
        fileType: 'rtmp/flv'
130
      }, {
131
        fileName: '12月14 16:59',
132
        fileId: 'ai-video_5A02296PAKA885B-video20201214165530.mp4',
133
        fileType: 'rtmp/flv'
134
      }, {
135
        fileName: '12月14 17:00',
136
        fileId: 'ai-video_5A02296PAKA885B-video20201214165531.mp4',
137
        fileType: 'rtmp/flv'
138
      }]
139
      this.videoPlayList = [{
140
        sources: [{
141
          src: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
142
          type: 'rtmp/flv'
143
        }]
144
      }, {
145
        sources: [{
146
          src: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
147
          type: 'rtmp/flv'
148
        }]
149
      }]
150
    },
127 151
    // 获取场景列表
128 152
    getSceneList() {
129 153
      this.sceneList = []
@ -132,50 +156,49 @@ export default {
132 156
          this.sceneList.push(this.totalList[i])
133 157
        }
134 158
      }
135
      const {a, b} = this.totalList[0]
136
      console.log(this.totalList[0]);
137
      console.log(a, b)
138 159
    },
139 160
    async handleReview (id) {
140 161
      // const res = await sysapi.getVideoPlayBack(id)
141 162
      // console.log(res)
142 163
      this.replayList = [{
143 164
        fileName: '12月14 16:55',
144
        fileId: 'ai-video_5A02296PAKA885B-video20201214165526.mp4',
145
        fileType: 'video/mp4'
165
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
166
        fileType: 'rtmp/flv'
146 167
      }, {
147 168
        fileName: '12月14 16:56',
148
        fileId: 'ai-video_5A02296PAKA885B-video20201214165527.mp4',
149
        fileType: 'video/mp4'
169
        fileId: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
170
        fileType: 'rtmp/flv'
150 171
      }, {
151 172
        fileName: '12月14 16:57',
152 173
        fileId: 'ai-video_5A02296PAKA885B-video20201214165528.mp4',
153
        fileType: 'video/mp4'
174
        fileType: 'rtmp/flv'
154 175
      }, {
155 176
        fileName: '12月14 16:58',
156 177
        fileId: 'ai-video_5A02296PAKA885B-video20201214165529.mp4',
157
        fileType: 'video/mp4'
178
        fileType: 'rtmp/flv'
158 179
      }, {
159 180
        fileName: '12月14 16:59',
160 181
        fileId: 'ai-video_5A02296PAKA885B-video20201214165530.mp4',
161
        fileType: 'video/mp4'
182
        fileType: 'rtmp/flv'
162 183
      }, {
163 184
        fileName: '12月14 17:00',
164 185
        fileId: 'ai-video_5A02296PAKA885B-video20201214165531.mp4',
165
        fileType: 'video/mp4'
186
        fileType: 'rtmp/flv'
166 187
      }]
167 188
      this.replayList = [{
168 189
        sources: [{
169
          src: 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4',
170
          type: 'video/mp4'
190
          src: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
191
          type: 'rtmp/flv'
171 192
        }]
172 193
      }, {
173 194
        sources: [{
174
          src: 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4',
175
          type: 'video/mp4'
195
          src: 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1',
196
          type: 'rtmp/flv'
176 197
        }]
177 198
      }]
199
      this.showReplayDialog = true
178 200
    },
201
    // 切换场景
179 202
    async tabClick (id) {
180 203
      this.selectedMonitorScene = id
181 204
      this.paramsObj.page = 0
@ -184,6 +207,7 @@ export default {
184 207
      this.videoCurrent = 1
185 208
      this.getVideoSurveillanceData(id)
186 209
    },
210
    // 获取风场下拉框列表
187 211
    getWindFiledList () {
188 212
      sysapi.getMonitorScene().then(resp => {
189 213
        let arr = resp.data.data
@ -204,12 +228,10 @@ export default {
204 228
    },
205 229
    // 获得风场大门数据
206 230
    getVideoSurveillanceData (id) {
207
      if (this.videoList.length <= 10) {
208
        this.paramsObj.page = this.videoCurrent
209
        sysapi.getVideoSurveillanceData({ params: {monitorSceneId: id} }).then(res => {
210
          console.log(res)
211
        })
212
      }
231
      this.paramsObj.page = this.videoCurrent
232
      sysapi.getVideoSurveillanceData({ params: {monitorSceneId: id} }).then(res => {
233
        this.videoList.push(res.data.data[0])
234
      })
213 235
    },
214 236
    // 进入识别记录界面
215 237
    goDistinguishRecord (id) {
@ -219,7 +241,6 @@ export default {
219 241
    onChangeGate (val) {
220 242
      this.videoList = []
221 243
      this.videoCurrent = val
222
      this.getVideoSurveillanceData()
223 244
    }
224 245
  }
225 246
}