<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>