首页 > 其他分享 >vue做播放器和进度条

vue做播放器和进度条

时间:2023-04-04 10:24:29浏览次数:42  
标签:播放器 vue false 进度条 vjs 50% js video const

<template>
  <video-player
    class="video-player vjs-custom-skin"
    ref="videoPlayer"
    :playsinline="true"
    :options="playerOptions"
    @play="onPlayerPlay($event)"
    @pause="onPlayerPause($event)"
    @seeking="videoSeeking" @seeked="videoSeeked" :events="['seeking','seeked']"
  >
  </video-player>
  <!-- <div class="progress-bar">
    <div class="progress-filled" :style="{width: progress + '%'}"></div>
  </div> -->

</template>
<script>
import { reactive, toRefs, onMounted ,ref} from 'vue'
export default {
  name: 'vueVideoPlayer',
  components: {},
  props: {
    videodata: String
  },
  emits: [],
  setup(props) {
   
    const state = reactive({
      VideoId:'',
      playerOptions: {
        //如果true,浏览器准备好时开始回放。
        autoplay: false,
        // 默认情况下将会消除任何音频。
        muted: false,
        // 导致视频一结束就重新开始。
        loop: false,
        // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
        preload: 'auto',
        language: 'zh-CN',
        // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
        // aspectRatio: '16:9',
        // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
        fluid: true,
        sources: [
          {
            //类型
            type: 'video/mp4',
            //url地址
            src: props.videodata
          }
        ],
        poster: , //你的封面地址
        //允许覆盖Video.js无法播放媒体源时显示的默认信息。
        notSupportedMessage: '此视频暂无法播放,请稍后再试',
        controls: true, // 是否显示控制栏
        controlBar: {
          timeDivider:false , //当前时间和持续时间的分隔符
          durationDisplay: false, //显示持续时间
          remainingTimeDisplay: false, //是否显示剩余时间功能
          fullscreenToggle: false //全屏按钮
        },
        playtimes: '', //视频观看起点

      },
      videoPlayer:ref(""),
        progress:0,

        isSeeking: false,
        isVideoEnd:false
    })
    onMounted(() => {})
    const onPlayerPlay = ($event) => {
      document.getElementById($event.id_).getElementsByClassName("vjs-big-play-button")[0].style.display='none'
      const VideoId = window.localStorage.getItem('VideoId')
      if (VideoId&&VideoId!=$event.id_) {
        document.getElementById(VideoId).player.pause()
      }
      window.localStorage.setItem('VideoId', $event.id_)
    }
    const onPlayerPause = ($event) => {
      document.getElementById($event.id_).getElementsByClassName("vjs-big-play-button")[0].style.display='block'
    }
    // //视频底部播放进度条
    // const updateProgressBar = ()=>{
      
    //   console.log("====");
    //   // console.log("state.myVideo",state.videoPlayer);
    //   const video = state.videoPlayer
    //   // console.log(video.player.currentTime());
    //   // console.log(video.currentTime());
    //   // console.log(video.currentTime);
    //   const precentComplete = (video.player.currentTime()/video.player.duration())*100
    //   console.log("precentComplete",precentComplete);
    //   state.progress = precentComplete
    // }
		// 正在拖动
		const videoSeeking=(item)=> {
			this.isSeeking = true
		}
		// 拖动结束
		const videoSeeked=(item)=>{
			this.isSeeking = false
		}

    return {
      ...toRefs(state),
      onPlayerPlay,
      onPlayerPause,
      videoSeeking,
      videoSeeked,
    }
  }
}
</script>
<style lang="less">
//修改点击播放按钮
.vjs-custom-skin > .video-js .vjs-big-play-button {
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 56px;
  height: 56px;
  box-sizing: border-box;
  border-radius: 50%;
  border: 2px solid #ffffff;
}
.video-js .vjs-big-play-button .vjs-icon-placeholder:before {
  top: 3px;
}
.video-js.vjs-fluid {
  height: 100% !important;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  .vjs-tech {
    object-fit: cover;
  }
}
.video-js.vjs-fluid {
  padding: 0;
}
.video-js .vjs-tech {
  width: unset;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.video-js .vjs-slider{
  cursor: default;
}
.video-js .vjs-progress-control{
  cursor: default;
}
</style>

标签:播放器,vue,false,进度条,vjs,50%,js,video,const
From: https://www.cnblogs.com/HatcherBlogs/p/17285520.html

相关文章

  • 【vue】vue3中的动画
    vue版本:vue3不过是控制动画放到了标签内控制在上图中,是绑定到了stylevue中关于动画的封装入场出场动画进入开始状态(时间点).v-enter-from{}动态效果(时间段).v-enter-active{}终止状态(时间点).v-enter-to{}.v-leave-from{}.v-leave-active{}.v-lea......
  • vue脚手架创建与环境安装
    1.安装Node.jsDownload|Node.js   在这里......
  • FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器
    继续看雷霄骅的课程资料-基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下MFC创建和配置。一、创建MFC工程文件->新建->项目->VisualC++->MFC应用程序应用程序类型,选择基于对话框生成效果如下:二、设置控件找到“工具箱”,就可以将相应的控件拖拽至应用程序对话框......
  • vue指令之属性指令
    目录属性指令示例属性指令标签上的属性可以绑定变量,变量变化,属性也会变化#什么是属性?比如:href/src/name/value/class/style...语法:v-bind:属性名="变量名"简写:属性名="变量名"示例<body><divid="app"><av-bind:href="url">点我</a>......
  • vue指令系统之文本指令
    目录什么是指令系统文本指令a-text指令a-html指令v-showv-if什么是指令系统指令系统是VUE提供的,语法为v-xx写在标签属性中的,系统都称之为指令文本指令文本指定必须写在标签属性上文本指定的值必须为变量,或者表达式v-xx#必须是一个标签属性<pv-text="a_url"></......
  • VUE插值语法
    目录基本使用基本使用在body中创建一个标签,一般使用div,定义好id后,在script中进行定义,在前台使用{{变量}}的形式进行调用,语法如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="./......
  • 前端Vue项目打包性能优化方案
    一.前言Vue框架通过数据双向绑定和虚拟DOM技术,帮我们处理了前端开发中最脏最累的DOM操作部分,我们不再需要去考虑如何操作DOM以及如何最高效地操作DOM;但Vue项目中仍然存在项目首屏优化、Webpack编译配置优化等问题,所以我们仍然需要去关注Vue项目性能方面的优化,使项......
  • vue3适配移动端的登录实现
    <scriptlang="ts"setup>import{ref}from'vue'constPHONE_NUMBER_REGEX=/^1[0-9]{10}$/constVERIFICATION_CODE_REGEX=/^[0-9]{6}$/constLOGIN_ERROR_MESSAGE='登录失败,请检查网络连接并重试'constGENERATE_CODE_ERROR_MESSAGE......
  • vue 项目启动报错opensslErrorStack ERR_OSSL_EVP_UNSUPPORTED
     错误裁图  原因:node升级版本过高 解决办法:windows中在vscode里在命令行输入命令修改环境变量:$env:NODE_OPTIONS="--openssl-legacy-provider"再执行:npmrunserve  linux中exportNODE_OPTIONS=--openssl-legacy-provider  ......
  • Vue3 v-drag 拖拽指令的简单使用
    文档官网文档:https://www.npmjs.com/package/v-drag使用安装、引入npminstallv-drag--saveimportdragfrom"v-drag"使用直接使用:<divv-drag>Dragme!</div>注意:对原本绝对定位水平居中的div,其居中的实现方式应为:div{ position:absolute; left:50%; trans......