m3u8 vue3

vue3打包mau8会报错 所以直接外部引用

<template>
  <a-modal
    title="监控"
    :visible="visible"
    width="70%"
    @cancel="handleCancel"
    @ok="handleOk"
    :footer="null"
  >
    <video ref="videoPlayer" class="video" muted width="100%" height="580px" />
  </a-modal>
</template>

<script setup>
import {
  ref,
  nextTick,
  onMounted,
  onBeforeUnmount,
  onActivated,
  onDeactivated,
} from "vue";

const visible = ref(false);
const player = ref(null);
const videoPlayer = ref(null);
let disposed = false; // 标记是否已销毁

onBeforeUnmount(() => {
  if (player.value) {
    player.value.dispose();
    disposed = true;
  }
});

onMounted(() => {
  if (player.value) {
    player.value.play();
  }
});

onActivated(() => {
  if (player.value) {
    player.value.play();
  }
});

onDeactivated(() => {
  if (player.value) {
    player.value.pause();
  }
});

const showModal = (url) => {
  visible.value = true;
  nextTick(() => {
    initVideo(url);
  });
};

const handleOk = () => {
  if (player.value) {
    player.value.pause(); // 暂停播放器
    //  player.value.dispose(); // 销毁播放器
    player.value = null;
  }
  visible.value = false;
};

const handleCancel = () => {
  if (player.value) {
    player.value.pause(); // 暂停播放器
    //  player.value.dispose(); // 销毁播放器
    player.value = null;
  }
  visible.value = false;
};

const initVideo = (url) => {
  if (!player.value || disposed) {
    disposed = false; // 重置销毁标记
    const script = document.createElement("script");
    script.src = "https://vjs.zencdn.net/8.3.0/video.min.js";
    script.onload = () => {
      player.value = videojs(videoPlayer.value, {
        autoplay: true,
        controlBar: false,
        controls: true,
        muted: true,
        preload: "auto",
        sources: [
          {
            src: url,
            type: "application/x-mpegURL",
          },
        ],
        playbackRates: [0.5, 1, 1.5, 2],
      });
    };
    document.body.appendChild(script);
  } else {
    player.value.src({ src: url, type: "application/x-mpegURL" });
    player.value.load();
    player.value.play();
  }
};

defineExpose({
  showModal,
});
</script>

<style lang="scss" scoped>
@import url("//vjs.zencdn.net/8.3.0/video-js.min.css");

.video,
video {
  position: absolute;
  width: 100%;
  height: 580px;
}

.vjs-modal-dialog {
  display: none !important;
}
:deep(.ant-modal .ant-modal-content) {
  height: 600px !important;
}
</style>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值