vue/video解析flv视频流+表格滚动+动态时间

安装flv
pnpm install flv.js -S|--save
import flvjs from 'flv.js'
<video id="videoElement" muted controls autoplay preload="auto"></video>
if (flvjs.isSupported()) {
        var videoElement = <any>document.getElementById('videoElement');
        var flvPlayer = flvjs.createPlayer({
            type: 'flv', 
            cors: true,  // 开启跨域访问,不然通不了
            isLive: true, 
            hasAudio: false,
            url:'flv视频流地址'
        },
		    {
            enableWorker: false, //不启用分离线程
            enableStashBuffer: false, //关闭IO隐藏缓冲区
            reuseRedirectedURL: true, //重用301/302重定向url,用于随后的请求,如查找、重新连接等。
            autoCleanupSourceBuffer: true //自动清除缓存
          }
		);
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play(); //开始播放
        // flvPlayer.stop(); //停止播放时打开
    }



表格滚动
第一种方式:
vue + ts + element-plus
interface Model {
  date: string
  name: string
  type: number
  level: number
  state: number
  address: string
}
const data: Model[] = [
  {
    date: '2016-05-03 23:12:00',
    name: 'CO告警',
    type: 1,
    level: 3,
    state: 1,
    address: '运巷01',
  },
  {
    date: '2016-05-02 23:12:00',
    name: '低压告警',
    type: 2,
    level: 2,
    state: 1,
    address: '运巷01',
  },
  {
    date: '2016-05-04 23:12:00',
    name: '透水告警',
    type: 3,
    level: 4,
    state: 2,
    address: '运巷01',
  },
  {
    date: '2016-05-01 23:12:00',
    name: '流水告警',
    type: 4,
    level: 1,
    state: 0,
    address: '运巷01',
  },
  {
    date: '2016-05-08 23:12:00',
    name: '电量告警',
    type: 5,
    level: 5,
    state: 1,
    address: '运巷01',
  },
  {
    date: '2016-05-06 23:12:00',
    name: '网络告警',
    type: 6,
    level: 3,
    state: 2,
    address: '运巷01',
  },
  {
    date: '2016-05-07 23:12:00',
    name: '低压告警',
    type: 2,
    level: 4,
    state: 0,
    address: '运巷01',
  },
  {
    date: '2016-05-06 23:12:00',
    name: '网络告警',
    type: 6,
    level: 3,
    state: 2,
    address: '运巷01',
  },
]
let timer: null | ReturnType<typeof setInterval> = null

const TableRef = ref<HTMLElement>()

function scrollAnimation() {
  const dom = TableRef.value!
  if (dom.scrollTop + dom.clientHeight < dom.scrollHeight) {
    dom.scrollTop += 1
  } else {
    dom.scrollTop = 0
  }
}

function startAnimation() {
  timer = setInterval(scrollAnimation, 50)
}

function clearAnimation() {
  if (timer === null) {
    return
  }
  clearInterval(timer)
}

onMounted(() => {
  const dom = TableRef.value
  if (dom === undefined) {
    return
  }
  startAnimation()
})

 <div
    ref="TableRef"
    class="h-full overflow-hidden"
    @mouseenter="clearAnimation"
    @mouseleave="startAnimation"
  >
    <div class="row head">
      <div class="col">
        告警名称
      </div>
      <div class="col">
        巡检点位
      </div>
      <div class="col">
        告警类别
      </div>
      <div class="col">
        告警时间
      </div>
      <div class="col">
        告警状态
      </div>
    </div>
    <div v-for="v in data" :key="v.name" class="row">
      <div class="col">
        {{ v.name }}
      </div>
      <div class="col">
        {{ v.address }}
      </div>
      <div class="col">
        {{ v.type }}
      </div>
      <div class="col">
        {{ v.date }}
      </div>
      <div class="col">
        {{ v.state }}
      </div>
    </div>
  </div>
<style lang="scss" scoped>
.row {
  display: grid;
  grid-template-columns: 2fr 3fr 2fr 3fr 2fr;
  height: 3vh;
  padding-left: 2vh;
}

.row + .row {
  margin-top: 0.5vh;
}

.row.head {
  position: sticky;
  top: 0;
  background-color: #063a79;
  color: #fff;
}

.row:not(.head) {
  background-color: #063a79;
  color: #758fac;

  & > :first-child {
    color: #fff;
  }
}
</style>


第二种方式,无缝滚动:
思路,使用两个表格,第一个表格内容隐藏,留下表头,第二个表格,隐藏表头,留下内容,使用滚动组件包裹
Vue3+element-plus+vue3-marquee
import { Vue3Marquee } from 'vue3-marquee'
<el-table class="right_table top-table" border style="width: 100%">
      <el-table-column prop="name" label="预警名称" />
      <el-table-column
        prop="level"
        label="预警层级"
      />
      <el-table-column prop="time" label="预警时间" />
    </el-table>
    <Vue3Marquee
      :pauseOnHover="true"
      :vertical="true"
      :clone="true"
      style="width: 100%"
    >
      <!-- :height="tableData1.length * 28 ?? 140" -->
      <el-table class="right_table bottom-table" border :data="tableData1">
        <el-table-column prop="name" label="预警名称" />
        <el-table-column prop="level" label="预警层级" />
        <el-table-column prop="time" label="预警时间" />
      </el-table>
    </Vue3Marquee>

<style lang="scss" scoped>
:deep(.bottom-table) {
  .el-table__header-wrapper {
    display: none;
    width: 100%;
  }
}
:deep(.top-table) {
  .el-table__body-wrapper {
    display: none;
  }
}
</style>

时间
vue 
import dayjs from 'dayjs'
const timeNow = ref(dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'))
onMounted(() => {
  timer.value = null
  timer.value = setInterval(() => {
    timeNow.value = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
  }, 1000)
})
onUnmounted(() => {
  // 组件卸载前执行的清理操作
  if (timer.value) {
    clearInterval(timer.value)
    timer.value = null
  }
})











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值