videojs宫格视频选择播放

项目需要四宫格播放视频,而且还要实现点击视频加入播放。

首先,肯定要实现再一个页面上显示多个视频源并播放视频:

html 复制代码
<template>
  <div>
    <div v-for="(item,index) in videoList" :key="index"  class="test_two_box">
      <video :id="'myVideo' + item.id" class="video-js">
        <source :src="item.src" type="video/mp4" />
      </video>
    </div>
  </div>
</template>


<script>
export default {
  data() {
    return {
      videoList: [
        {
          id: 0,
          type: 'video/mp4',
          src: '/mp4/1.mp4',
          name:'视频1'
        },
        {
          id: 1,
          type: 'video/mp4',
          src: '/mp4/2.mp4',
          name:'视频2'
        },
        {
          id: 2,
          type: 'video/mp4',
          src: '/mp4/3.mp4',
          name:'视频3'
        },
        {
          id: 4,
          type: 'video/mp4',
          src: '/mp4/4.mp4',
          name:'视频5'
        }
      ]
    }
  },
  mounted() {
    this.videoList.map((item, index) => {
      let myPlayer = this.$video('myVideo' + item.id, {
        //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
        controls: true,
        poster: item.cover,
        //自动播放属性,muted:静音播放
        // autoplay: "muted",
        //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
        preload: "auto",
        //设置视频播放器的显示宽度(以像素为单位)
        width: "300px",
        //设置视频播放器的显示高度(以像素为单位)
        height: "150px"
      });
    })
  }
}
</script>

这样就能显示四个视频,但是四个视频的格式是一列的格式,与我们的目标四宫格不符。

可以在前端展示部分做一个步长2的循环,让每一行都有两个视频:

html 复制代码
<template>
  <div>
    <div v-for="(item,index) in videoList" :key="index">
     <ul v-if="index % 2 == 0">
        <video :id="'myVideo' + videoList[index].id" class="video-js">
          <source :src="videoList[index].src" type="video/mp4" />
        </video>
        <video :id="'myVideo' + videoList[index + 1].id" class="video-js">
          <source :src="videoList[index + 1].src" type="video/mp4" />
        </video>
      </ul>
    </div>
  </div>
</template>


<script>
	......
</script>

这样就能实现一个页面四宫格播放四个视频。但是这样只能播放固定的写死的四个视频,怎么实现选择播放哪个呢?

首先,一定获取待播放的全部视频列表showallvideoList。之后可以按钮的方式,选择全部视频列表的某个视频,将其替换正在播放视频列表showvideoList中的某一个视频。至于替换哪一个,可以通过flag的形式标记最早播放的视频,替换后更新flag即可。

但是代码里,播放视频是通过循环建立myPlayer实现的,这种实现方法,只能修改最后一个建立的myPlayer。所以为此要建立四个不同的myPlayer

html 复制代码
<template>
	......
</template>
<script>
export default {
  data() {
    return {
      oddflag:true,
      showvideoList: [
        {
          id: 0,
          type: 'video/mp4',
          src: '/mp4/1.mp4',
          name:'视频1'
        },
        {
          id: 1,
          type: 'video/mp4',
          src: '/mp4/2.mp4',
          name:'视频2'
        },
        {
          id: 2,
          type: 'video/mp4',
          src: '/mp4/3.mp4',
          name:'视频3'
        },
        {
          id: 4,
          type: 'video/mp4',
          src: '/mp4/4.mp4',
          name:'视频4'
        }
      ]
      ,
      showallvideoList: [
        {
          id: 0,
          type: 'video/mp4',
          src: '/mp4/1.mp4',
          name:'视频1'
        },
        {
          id: 1,
          type: 'video/mp4',
          src: '/mp4/2.mp4',
          name:'视频2'
        },
        {
          id: 2,
          type: 'video/mp4',
          src: '/mp4/3.mp4',
          name:'视频3'
        },
        {
          id: 3,
          type: 'video/mp4',
          src: '/mp4/4.mp4',
          name:'视频4'
        },
        {
          id: 4,
          type: 'video/mp4',
          src: '/mp4/5.mp4',
          name:'视频5'
        },
        {
          id: 5,
          type: 'video/mp4',
          src: '/mp4/6.mp4',
          name:'视频6'
        }
      ]
    }
  },
  mounted() {

      this.showvideoList.map((item, index) => {
          if(index == 0){
            this.myPlayer0 = this.$video('myVideo' + item.id, {
            //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
            controls: true,
            // poster: item.cover,
            //自动播放属性,muted:静音播放
            // autoplay: "muted",
            //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
            preload: "auto",
            //设置视频播放器的显示宽度(以像素为单位)
            width: "600px",
            //设置视频播放器的显示高度(以像素为单位)
            height: "300px",
          })
        }
        if(index == 1){
            this.myPlayer1 = this.$video('myVideo' + item.id, {
            //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
            controls: true,
            // poster: item.cover,
            //自动播放属性,muted:静音播放
            // autoplay: "muted",
            //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
            preload: "auto",
            //设置视频播放器的显示宽度(以像素为单位)
            width: "600px",
            //设置视频播放器的显示高度(以像素为单位)
            height: "300px",
          })
        }
        if(index == 2){
            this.myPlayer2 = this.$video('myVideo' + item.id, {
            //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
            controls: true,
            // poster: item.cover,
            //自动播放属性,muted:静音播放
            // autoplay: "muted",
            //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
            preload: "auto",
            //设置视频播放器的显示宽度(以像素为单位)
            width: "600px",
            //设置视频播放器的显示高度(以像素为单位)
            height: "300px",
          })
        }
        if(index == 3){
            this.myPlayer3 = this.$video('myVideo' + item.id, {
            //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
            controls: true,
            // poster: item.cover,
            //自动播放属性,muted:静音播放
            // autoplay: "muted",
            //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
            preload: "auto",
            //设置视频播放器的显示宽度(以像素为单位)
            width: "600px",
            //设置视频播放器的显示高度(以像素为单位)
            height: "300px",
          })
        }
      })
  },
  methods:{
    show(item){
      console.log(item)
      if(this.oddflag){
        console.log(this.showvideoList[2])
        this.showvideoList[2] = item

      }
      else{
        console.log(this.showvideoList[3])
        this.showvideoList[3] = item
      }
      this.reshow(this.oddflag)
      this.oddflag = !this.oddflag
    },
    reshow(oddflag){
      console.log(this.showvideoList)
      if(oddflag){
        this.myPlayer2.src({src:this.showvideoList[2].src,type:this.showvideoList[2].type})
      }
      else{
        this.myPlayer3.src({src:this.showvideoList[3].src,type:this.showvideoList[3].type})
      }
      // console.log(this.showvideoList)
      // this.myPlayer.src({src:this.showvideoList[3].src,type:this.showvideoList[3].type})
    }
  }
}
</script>

(本示例实现最后两个视频的选择播放)

这样就可以实现宫格视频选择播放了

相关推荐
大草原的小灰灰8 小时前
Python基础语法
开发语言·python
雪芽蓝域zzs8 小时前
vue解构平铺VS对象包裹
前端·javascript·vue.js
Pocker_Spades_A9 小时前
视频不用再一张张截图:ClipSketch AI 把关键画面转成漫画,还能顺手生成文案
人工智能·音视频
星辰徐哥9 小时前
本地视频预览别只自己看:把Remotion动效项目发给客户远程验收
docker·ai·node.js·html·音视频·react·remotion
镜像视界(浙江)科技有限公司9 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
你不是我我9 小时前
【AI 测评】想用自己的声音给视频配音?Index-TTS本地部署这样做
人工智能·音视频
泡泡鱼(敲代码中)9 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
潜创微科技11 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
默_笙11 小时前
🚲 从写信到打电话:WebSocket 双工通信与跨域方案的"通信进化史"
前端·javascript
Escalating_xu11 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm