vue video 多个视频切换后视频不显示的解决方法

先说一下我这边的需求是视频需要轮播,一个人员有多个视频,左右轮播是轮播某个人员下的视频,上下切换是切换人员。

vue 代码

html 复制代码
      <el-carousel
        indicator-position="none"
        ref="carousel"
        arrow="always"
        :interval="10000"
        @change="carouselChange"
      >
        <transition name="carousel-arrow-right">
          <button
            type="button"
            @click="arrowDown('top')"
            class="el-carousel__arrow el-carousel__arrow--right el-carousel__arrow--top"
          >
            <i class="el-icon-arrow-up"></i>
          </button>
        </transition>
        <transition name="carousel-arrow-right">
          <button
            @click="arrowDown('bottom')"
            type="button"
            class="el-carousel__arrow--bottom"
          >
            <i class="el-icon-arrow-down"></i>
          </button>
        </transition>
        <!--   -->
        <el-carousel-item
          v-for="(item, index) in videoUrl"
          :key="index"
          v-loading="loading"
          element-loading-spinner=" "
          element-loading-background="rgba(0, 0, 0, 0.8)"
          @mouseenter.native="autoplayHandler"
        >
          <template v-if="isPlayer">
            <div style="margin: 5px 0">{{ '张三' }}</div>
            <div style="width: 100%; height: 76%" id="video-box">
              <video
                :id="`my-video${index}`"
                class="video-js vjs-default-skin"
                controls
                preload="auto"
              >
                <source :src="item.monitorUrl" type="application/x-mpegURL" />
              </video>
            </div>
          </template>
        </el-carousel-item>
      </el-carousel>

js代码:

javascript 复制代码
export default {
  data() {
     return {
      videoUrl: [],
      arr: [
        {
          name: "张三",
          videoUrlList: [
            {
              monitorUrl:
                "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8",
            },
            {
              monitorUrl:
                "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8",
            },
            {
              monitorUrl:
                "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8",
            },
          ],
        },
        {
          name: "李四",
          videoUrlList: [
            {
              monitorUrl:
                "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8",
            },
          ],
        },
      ],
      selectionObj:{},
      DownIndex: 0,
      player: [],
      isPlayer: true,
    };
  },
  mounted() {
    let _that = this;
        //默认取第一个
    _that.selectionObj=arr[0]
    setTimeout(() => {
      _that.getVideo();
    }, 6000);
  },
  //销毁事件
  beforeDestroy() {
    this.clearVideo();
  },
  methods: {
    //销毁视频
    clearVideo() {
      if (this.player != null) {
        for (let i = 0; i < this.player.length; i++) {
          this.player[i].dispose(); //dispose()是官方的销毁函数
        }
      }
    },
    //初始化
    getVideo() {
      const _this = this;
      //判断视频是否存在如果存在不需要重新初始化
      if(_this.player.length!=0) return
      this.videoUrl.map((item,index) => {
        let player = videojs(
          `my-video${index}`,
          {
            bigPlayButton: false,
            textTrackDisplay: false,
            posterImage: true,
            errorDisplay: false,
            controlBar: true,
            // restoreEl: true,
            autoplay: true, //是否自动播放
            muted: true, //静音模式 、、 解决首次页面加载播放
          },
          function () {
            // this.reset()//视频中重置方法 
            this.load();//刷新视频地址
            _this.player.push(player);//player是一个空数组 存放实例化的视频实例
          }
        );
      });
    },
       //监控上下切换
    arrowDown(type) {
    //点切换是销毁视频
      this.clearVideo();
      this.isPlayer = false; //切换后

      const arr= this.arr;
      const index =
        type == "top"
          ? this.DownIndex == 0
            ? this.arr.length - 1
            : this.DownIndex - 1
          : this.DownIndex == this.arr.length - 1
          ? 0
          : this.DownIndex + 1;
      this.DownIndex = index;
      this.$nextTick(() => {
        this.canteenObj = {};
      this.videoUrl = [];
        if (arr&& arr[this.DownIndex].videoUrlList) {
          this.selectionObj= canteenList[this.DownIndex];
          this.videoUrl = canteenList[this.DownIndex].videoUrlList;
          // this.loading = true;
          this.isPlayer = true; //切换后
        }
        //切换到轮播第一页
        this.$refs.carousel.setActiveItem(0);

        // videoBox.load()
        this.carouselChange(0);
        // this.getVideo(index);
      });
    },
    //监控视频切换播放
    carouselChange(index) {
    // return
      setTimeout(() => {
        this.isPlayer = true;
        this.getVideo(index);
      }, 6000);
    },
    // 轮播图鼠标移入清除时间函数
    autoplayHandler(index) {
      this.$refs.carousel.pauseTimer();
    },
  }
  
}

样式:

css 复制代码
 <style scoped>
>>> .el-carousel,
>>> .el-carousel__container {
  height: 100%;
}
>>> .video-js {
  height: calc(100% - 6px);
  width: 100%;
}
.el-carousel__arrow--top {
  top: 0px;
  left: 46%;
  transform: translate(-50%, 0);
}
.el-carousel__arrow--bottom {
  bottom: 5px;
  position: absolute;
  left: 50%;
  height: 36px;
  width: 36px;
  border-radius: 50%;
  background-color: rgba(31, 45, 61, 0.11);
  color: #ffffff;
  border: none;
  outline: none;
  z-index: 10;
  transform: translate(-50%, 0);
}
</style>

实现效果图:

相关推荐
allnlei4 小时前
Opus In-Band FEC 详解:原理、实现与开源方案
ffmpeg·音视频·gstreamer
爱吃提升5 小时前
文生视频模型发展趋势(2026)
人工智能·音视频
可乐鸡翅yeah_6 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
apple_692658858 小时前
最新ComfyUI 0.37.1使用教程:画图、3D、音频都有改动 ComfyUI升级到0.37.1啦,新增或改进五大功能
音视频
Mr_Mao10 小时前
告别选型困难!集 VueUse、ahooks、Mantine 于一身:286 个 Hook 的 ReaUse 来了
前端·javascript·react.js
qwfy11 小时前
我要用 AI-native 架构,从零重建一套制造业 ERP/MES
vue.js·spring boot·架构
默_笙11 小时前
🚙 一条腿走路会摔:ES 关键词检索、混合召回与 ReRank 裁判
前端·javascript
dsyyyyy110112 小时前
Vue 3 Watch 监视完全指南
前端·javascript·vue.js
瞬时出道12 小时前
AI 回答为什么能一个字一个字蹦出来?前端搞懂 SSE 这一篇就够了
vue.js
VidDown13 小时前
从视频画面里提取文字:OCR、文字检测与结构化输出
python·网络协议·ocr·音视频·视频编解码·视频