You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							166 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							166 lines
						
					
					
						
							3.5 KiB
						
					
					
				| <template> | |
|   <div class="video-container"> | |
|     <div class="header"> | |
|       <ElSelect @change="showVideo" v-model="cameraId"> | |
|         <ElOption v-for="item in urls" | |
|           :key="item.id" :label="item.deviceName" :value="item.iotDeviceId"> | |
|         </ElOption> | |
|       </ElSelect> | |
|     </div> | |
|     <Transition name="fade" mode="out-in"> | |
|       <video controls autoplay muted class="video-stream" v-bind="$attrs" ref="videoContainerRef" /> | |
|     </Transition> | |
|   </div> | |
| </template> | |
| 
 | |
| <script> | |
| import { HttpLivePlayer, openLiveVideo } from "./videoStream.js" | |
| 
 | |
| import { | |
|   getNearCameraNew, | |
| } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js"; | |
| 
 | |
| export default { | |
|   name: 'VideoControls', | |
|   components: { | |
|   }, | |
|   props: { | |
|     // 桩号 | |
|     pileNum: { | |
|       type: String, | |
|       default: null | |
|     }, | |
|     rangeIndex: { | |
|       type: String, | |
|       default: null | |
|     }, | |
|     showHeader: { | |
|       type: Boolean, | |
|       default: true | |
|     } | |
|   }, | |
|   data() { | |
|     return { | |
|       active: "video", | |
|       player: null, | |
|       urls:[], | |
|       cameraId: null | |
|     } | |
|   }, | |
|   async mounted() { | |
|     this.playVideo(); | |
|     this.$once("hook:beforeDestroy", () => this.player?.destroy()); | |
|   }, | |
|   methods: { | |
|      | |
|     async playVideo() { | |
|       this.player?.destroy(); | |
|        | |
|       let {code,data} = await getNearCameraNew(this.pileNum).catch(() => ({})); | |
|       if ( | |
|         code != 200 || | |
|         (Array.isArray(data) ? !data?.length : !Object.keys(data || {}).length) | |
|       ) { | |
|         Message.warning("未获取到附近的相机信息"); | |
|         return; | |
|       } | |
|       if(data[this.rangeIndex]){ | |
|         this.urls = data[this.rangeIndex] | |
|         this.cameraId = data[this.rangeIndex][0]['iotDeviceId'] | |
|         this.showVideo(); | |
|       } | |
|     }, | |
|     showVideo(){ | |
|       this.player = new HttpLivePlayer(this.$refs.videoContainerRef, { camId: this.cameraId}); | |
|     } | |
|   } | |
| } | |
| </script> | |
| 
 | |
| <style lang='scss' scoped> | |
| .video-container { | |
|   position: relative; | |
|   background-color: #000; | |
|   height: 240px; | |
|   overflow: hidden; | |
|   display: flex; | |
|   flex-direction: column; | |
|   justify-content: center; | |
| 
 | |
|   .fade-enter-active, | |
|   .fade-leave-active { | |
|     transition: opacity 0.24s ease; | |
|   } | |
| 
 | |
|   .fade-enter-from, | |
|   .fade-leave-to { | |
|     opacity: 0; | |
|   } | |
| 
 | |
|   .header { | |
|     width: 100%; | |
|     z-index: 999; | |
|     display: flex; | |
|     justify-content: space-between; | |
|     .radio { | |
|       background: #265A70; | |
|       border-radius: 41px 41px 41px 41px; | |
|       overflow: hidden; | |
|       opacity: 1; | |
|       border: 1px solid #3DE8FF; | |
|       font-size: 12px; | |
|       // font-family: PingFang SC, PingFang SC; | |
|       font-weight: 400; | |
|       color: #FFFFFF; | |
|       line-height: 14px; | |
|       height: fit-content; | |
| 
 | |
|       // -webkit-background-clip: text; | |
|       // -webkit-text-fill-color: transparent; | |
|  | |
|       .active { | |
|         background-color: rgba(61, 232, 255, 1); | |
|       } | |
| 
 | |
|       span { | |
|         background-color: rgba(38, 90, 112, 1); | |
|         padding: 4px 9px; | |
|         display: inline-block; | |
|         cursor: pointer; | |
| 
 | |
|         &:hover { | |
|           background-color: rgba(61, 232, 255, 1); | |
|         } | |
|       } | |
|     } | |
| 
 | |
|     .btn { | |
|       background: #265A70; | |
|       border-radius: 6px 6px 6px 6px; | |
|       opacity: 1; | |
|       border: 1px solid #3DE8FF; | |
|       font-size: 12px; | |
|       // font-family: PingFang SC, PingFang SC; | |
|       font-weight: 400; | |
|       color: #FFFFFF; | |
|       line-height: 14px; | |
|       padding: 3px 9px; | |
|       cursor: pointer; | |
|       // -webkit-background-clip: text; | |
|       // -webkit-text-fill-color: transparent; | |
|     } | |
|   } | |
| 
 | |
| 
 | |
|   .video-stream, | |
|   img { | |
|     height: 100%; | |
|     max-height: 100%; | |
|     max-width: 100%; | |
|   } | |
| 
 | |
|   .video-stream { | |
|     width: 100%; | |
|   } | |
| } | |
| </style>
 | |
| 
 |