playerContainer.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <view class="player-container">
  3. <view class="av-box">
  4. <template v-for="(item,index) in openDataed">
  5. <view class="av-box-item" :key="index">
  6. <view class="video-wapper">
  7. <view class="video-player">
  8. <view class="video-header">
  9. {{item.plate}} - {{item.label}}
  10. </view>
  11. <Player :videoUrl="item.videoUrl"></Player>
  12. </view>
  13. </view>
  14. </view>
  15. </template>
  16. </view>
  17. </view>
  18. </template>
  19. <script>
  20. import {openVideo} from '@/api/monitor.js'
  21. import {getImages} from '@/plugins/images'
  22. import {isArray,isEmpty} from 'lodash'
  23. // #ifdef H5
  24. import Player from './h5Player.vue'
  25. // #endif
  26. export default {
  27. components: {
  28. Player
  29. },
  30. computed: {
  31. checkedArr() {
  32. return this.$store.state.monitor.checkedArr
  33. }
  34. },
  35. watch: {
  36. checkedArr: {
  37. immediate: true,
  38. deep: true,
  39. handler(newVal,oldVal) {
  40. let newlist = newVal.filter(item => { return item.code == "camera" })
  41. // console.log(newVal,oldVal,'checkedArrcheckedArrcheckedArr')
  42. this.openDataedOrgin = {}
  43. this.openDataed = []
  44. if(!isEmpty(newlist)) {
  45. this.openAllChanel(newlist)
  46. }
  47. }
  48. }
  49. },
  50. created() {
  51. },
  52. data() {
  53. return {
  54. openDataedOrgin: {}, //打开视频数据
  55. openDataed: [], //打开视频数据
  56. }
  57. },
  58. methods: {
  59. openAllChanel(chanelList) {
  60. // console.log(chanelList,'chanelList')
  61. let deviceIdObj = {}
  62. if(isArray(chanelList)) {
  63. chanelList.forEach((item) => {
  64. let newId = `${item.deviceId}-${item.videoNumber}`
  65. if(!this.openDataedOrgin[newId]) {
  66. let obj = {
  67. newId,
  68. ...item,
  69. status: 0, //-1播放失败 0未播放 1播放
  70. videoUrl: ''
  71. }
  72. this.openDataedOrgin[newId] = obj
  73. this.openDataed.push(this.openDataedOrgin[newId] = obj)
  74. /* 请求接口用 */
  75. if(!deviceIdObj[item.deviceId]) {
  76. deviceIdObj[item.deviceId] = [item.videoNumber]
  77. } else {
  78. deviceIdObj[item.deviceId].push(item.videoNumber)
  79. }
  80. }
  81. })
  82. for(let i in deviceIdObj) {
  83. this.openAv(i, deviceIdObj[i])
  84. }
  85. console.log(deviceIdObj,'this.openDataedOrginthis.openDataedOrgin')
  86. }
  87. },
  88. openAv(deviceId,channels,Rate) {
  89. let dataRate = 1//子码流 默认 1
  90. if (typeof Rate === 'number') {
  91. dataRate = Rate
  92. }
  93. let params = {
  94. channels, // 通道号
  95. dataRate: dataRate, // 码流类型 0:主码流,1:子码流 默认 1
  96. deviceId, // 设备号
  97. };
  98. openVideo(params).then((res)=> {
  99. if (res.code == 0) {
  100. res.data.forEach(e => {
  101. let newId = `${e.deviceId}-${e.channel}`
  102. this.openDataedOrgin[newId].status == 1;
  103. this.openDataedOrgin[newId].videoUrl = getImages(e.videoUrl);
  104. })
  105. }
  106. }).catch((error)=> {
  107. console.log('设备命令下发失败',error)
  108. channels.forEach(e => {
  109. let newId = `${deviceId}-${e}`
  110. this.openDataedOrgin[newId].status == -1
  111. this.openDataedOrgin[newId].videoUrl = 'command_failed'
  112. })
  113. });
  114. }
  115. }
  116. }
  117. </script>
  118. <style lang="scss" scoped>
  119. .player-container {
  120. width: 100%;
  121. height: 100%;
  122. .av-box {
  123. display: flex;
  124. flex-wrap: wrap;
  125. .av-box-item {
  126. width: 50%;
  127. // flex: 1 1 50%;
  128. .video-wapper {
  129. margin: 20rpx !important;
  130. height: 280rpx;
  131. .video-player {
  132. position: relative;
  133. width: 100%;
  134. height: 100%;
  135. display: flex;
  136. align-items: center;
  137. justify-content: center;
  138. overflow: hidden;
  139. border: 1px solid #243253;
  140. background: #071323;
  141. border-color: none;
  142. .video-header {
  143. position: absolute;
  144. top: 0;
  145. left: 0;
  146. height: 30rpx;
  147. color: #6DC0FF;
  148. font-size: 22rpx;
  149. width: 100%;
  150. background-color: rgba(11, 24, 40, 0.6);
  151. z-index: 1000;
  152. padding-left: 4rpx;
  153. }
  154. }
  155. }
  156. }
  157. }
  158. }
  159. </style>