Selaa lähdekoodia

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

xiayu3 4 vuotta sitten
vanhempi
commit
26f78ba0b9

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

34
        name: 'volumePanel', // 音量控制
34
        name: 'volumePanel', // 音量控制
35
        inline: true // 不使用水平方式
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
    }
103
    }
104
  },
104
  },
105
  created () {
105
  created () {
106
    this.getDeviceData()
107
    this.getDeviceTypes()
108
    this.getTaskName()
106
    this.getTaskName()
109
    this.getmatchingType()
107
    this.getmatchingType()
110
  },
108
  },
116
    },
114
    },
117
    getmatchingType() {
115
    getmatchingType() {
118
      sysapi.getCharSpecList('AI_MATCHER_MODE').then(res => {
116
      sysapi.getCharSpecList('AI_MATCHER_MODE').then(res => {
117
        console.log(res);
119
        this.matchingTypeList = res.data
118
        this.matchingTypeList = res.data
120
      })
119
      })
121
    },
120
    },
132
      }
131
      }
133
      return typecellClass
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
    selectHandle () {
135
    selectHandle () {
165
      this.page = 1
136
      this.page = 1

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

62
    }
62
    }
63
  },
63
  },
64
  methods: {
64
  methods: {
65
    // 初始化
65
    handlePlayerInited(player) {
66
    handlePlayerInited(player) {
66
      this.$player = player
67
      this.$player = player
67
      window.player = this
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
    async handleTabChange(name, index) {
75
    async handleTabChange(name, index) {
70
      this.$player.pause()
76
      this.$player.pause()
79
    resetVideoList() {
85
    resetVideoList() {
80
      const videoList = this.list.map((item, index) => {
86
      const videoList = this.list.map((item, index) => {
81
        const { fileId, fileType } = item
87
        const { fileId, fileType } = item
82
        console.log(fileType)
83
        return {
88
        return {
84
          index,
89
          index,
85
          fileId,
90
          fileId,
136
      // fake
141
      // fake
137
      return new Promise((resolve, reject) => {
142
      return new Promise((resolve, reject) => {
138
        setTimeout(() => {
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
          resolve({
145
          resolve({
144
            url
146
            url
145
          })
147
          })

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

13
      </t-select>
13
      </t-select>
14
    </div>
14
    </div>
15
    <div class="page-bottom">
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
      </div> -->
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
      </div>
21
      </div>
42
    </div>
22
    </div>
43
    <t-pager :page-size="videoPageSize" :current="videoCurrent" :total="videoTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
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
  </div>
25
  </div>
46
</template>
26
</template>
47
<script>
27
<script>
48
import sysapi from '@/api/videoSurveillance'
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
import VideoPlayer from '@/components/VideoPlayer'
31
import VideoPlayer from '@/components/VideoPlayer'
52
import videojs from 'video.js'
32
import videojs from 'video.js'
53
window.videojs = videojs
33
window.videojs = videojs
34
54
require('videojs-flash')
35
require('videojs-flash')
55
require('videojs-playlist')
36
require('videojs-playlist')
56
require('video.js/dist/lang/zh-CN.js')
37
require('video.js/dist/lang/zh-CN.js')
57
require('video.js/dist/video-js.min.css')
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
export default {
40
export default {
85
  components: { ReplayDialog, VideoPlayer },
41
  components: { ReplayDialog, VideoPlayer, RtmpVideo },
86
  filters: {
42
  filters: {
87
    handleText (value) {
43
    handleText (value) {
88
      if (!value) return ''
44
      if (!value) return ''
93
    }
49
    }
94
  },
50
  },
95
  data () {
51
  data () {
96
    const playerOptions = Object.assign({}, defaultPlayerOptions, this.options)
97
    return {
52
    return {
98
      playerOptions,
99
      videoCurrent: 1, // 大门分页数据
53
      videoCurrent: 1, // 大门分页数据
100
      videoPageSize: 10, // 大门分页数据
54
      videoPageSize: 10, // 大门分页数据
101
      videoTotal: 100, // 大门分页总数
55
      videoTotal: 100, // 大门分页总数
106
      },
60
      },
107
      organizationList: [], // 风场数据
61
      organizationList: [], // 风场数据
108
      gateFieldData: 101101,
62
      gateFieldData: 101101,
109
      videoList: [],
63
      videoList: [], // 场景数据列表
110
      sceneList: [], // 场景列表
64
      sceneList: [], // 场景列表
111
      totalList: [], // 所有风场数据列表
65
      totalList: [], // 所有风场数据列表
112
      selectedMonitorScene: '',
113
      showReplayDialog: true,
66
      selectedMonitorScene: '', // 当前选择场景
67
      videoPlayList: [],
68
      showReplayDialog: false,
114
      replayList: []
69
      replayList: []
115
    }
70
    }
116
  },
71
  },
117
  mounted () {
72
  mounted () {
118
    // var myButton = videojs.player.controlBar.addChild('button', {
119
    //   text: 'Press me'
120
    //   // other options
121
    // })
122
    // myButton.addClass('html-classname')
123
    this.getWindFiledList() // 获取风场列表
73
    this.getWindFiledList() // 获取风场列表
124
    this.handleReview()
74
    this.getdata()
125
  },
75
  },
126
  methods: {
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
    getSceneList() {
152
    getSceneList() {
129
      this.sceneList = []
153
      this.sceneList = []
132
          this.sceneList.push(this.totalList[i])
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
    async handleReview (id) {
160
    async handleReview (id) {
140
      // const res = await sysapi.getVideoPlayBack(id)
161
      // const res = await sysapi.getVideoPlayBack(id)
141
      // console.log(res)
162
      // console.log(res)
142
      this.replayList = [{
163
      this.replayList = [{
143
        fileName: '12月14 16:55',
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
        fileName: '12月14 16:56',
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
        fileName: '12月14 16:57',
172
        fileName: '12月14 16:57',
152
        fileId: 'ai-video_5A02296PAKA885B-video20201214165528.mp4',
173
        fileId: 'ai-video_5A02296PAKA885B-video20201214165528.mp4',
153
        fileType: 'video/mp4'
174
        fileType: 'rtmp/flv'
154
      }, {
175
      }, {
155
        fileName: '12月14 16:58',
176
        fileName: '12月14 16:58',
156
        fileId: 'ai-video_5A02296PAKA885B-video20201214165529.mp4',
177
        fileId: 'ai-video_5A02296PAKA885B-video20201214165529.mp4',
157
        fileType: 'video/mp4'
178
        fileType: 'rtmp/flv'
158
      }, {
179
      }, {
159
        fileName: '12月14 16:59',
180
        fileName: '12月14 16:59',
160
        fileId: 'ai-video_5A02296PAKA885B-video20201214165530.mp4',
181
        fileId: 'ai-video_5A02296PAKA885B-video20201214165530.mp4',
161
        fileType: 'video/mp4'
182
        fileType: 'rtmp/flv'
162
      }, {
183
      }, {
163
        fileName: '12月14 17:00',
184
        fileName: '12月14 17:00',
164
        fileId: 'ai-video_5A02296PAKA885B-video20201214165531.mp4',
185
        fileId: 'ai-video_5A02296PAKA885B-video20201214165531.mp4',
165
        fileType: 'video/mp4'
186
        fileType: 'rtmp/flv'
166
      }]
187
      }]
167
      this.replayList = [{
188
      this.replayList = [{
168
        sources: [{
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
        sources: [{
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
    async tabClick (id) {
202
    async tabClick (id) {
180
      this.selectedMonitorScene = id
203
      this.selectedMonitorScene = id
181
      this.paramsObj.page = 0
204
      this.paramsObj.page = 0
184
      this.videoCurrent = 1
207
      this.videoCurrent = 1
185
      this.getVideoSurveillanceData(id)
208
      this.getVideoSurveillanceData(id)
186
    },
209
    },
210
    // 获取风场下拉框列表
187
    getWindFiledList () {
211
    getWindFiledList () {
188
      sysapi.getMonitorScene().then(resp => {
212
      sysapi.getMonitorScene().then(resp => {
189
        let arr = resp.data.data
213
        let arr = resp.data.data
204
    },
228
    },
205
    // 获得风场大门数据
229
    // 获得风场大门数据
206
    getVideoSurveillanceData (id) {
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
    goDistinguishRecord (id) {
237
    goDistinguishRecord (id) {
219
    onChangeGate (val) {
241
    onChangeGate (val) {
220
      this.videoList = []
242
      this.videoList = []
221
      this.videoCurrent = val
243
      this.videoCurrent = val
222
      this.getVideoSurveillanceData()
223
    }
244
    }
224
  }
245
  }
225
}
246
}