Vue3.js+Ts+Vide.js封装视频播放组件

Vue3.js+Ts+Vide.js封装视频播放组件

Video组件

<template>
  <div class="videoPlay">
    <video
      ref="m3u8_video"
      class="video-js vjs-default-skin vjs-big-play-centered"
      controls
    >
      <source :src="path" />
    </video>
  </div>
</template>
<script lang="ts" setup>
import { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';
import videojs, { VideoJsPlayer } from 'video.js';
import 'video.js/dist/video-js.css';
import zh from 'video.js/dist/lang/zh-CN.json';
const props = withDefaults(
  defineProps<{
    path: string;
    autoPlay?: boolean;
  }>(),
  { autoPlay: false },
);
const m3u8_video = ref();
let player: VideoJsPlayer;
const initPlay = async () => {
  videojs.addLanguage('zh-CN', zh);
  await nextTick();
  const options = {
    muted: true,
    controls: true,
    autoplay: props.autoPlay && props.path,
    loop: true,
    language: 'zh-CN',
    techOrder: ['html5'],
  };
  player = videojs(m3u8_video.value, options, () => {
    videojs.log('播放器已经准备好了!');
    if (props.autoPlay && props.path) {
      player.play();
    }
    player.on('ended', () => {
      videojs.log('播放结束了!');
    });
    player.on('error', () => {
      videojs.log('播放器解析出错!');
    });
  });
};
onMounted(() => {
  initPlay();
});
//直接改变路径测试
watch(
  () => props.path,
  () => {
    player.pause();
    player.src(props.path);
    player.load();
    if (props.path) {
      player.play();
    }
  },
);
onBeforeUnmount(() => {
  player?.dispose();
});
</script>
<style lang="scss" scoped>
.videoPlay {
  .video-js {
    width: 640px;
    height: 360px;
  }
}
</style>

外部组件的使用

<template>
    <div class="MvContent">
      <videoPlay :path="MvUrl" :autoPlay="true" />
    </div>
  </div>
</template>
<script setup lang="ts">
import videoPlay  from '@/components/Video.vue';
</script>
<style scoped lang="less">
  .MvContent {
    border-radius: 13px;
    overflow: hidden;
    margin-top: 20px;
    width: 640px;
    height: 360px;
  }
</style>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫汪枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值