vue video和vue-video-player实现视频铺满教程

网页放置视频播放器,我一般都是用video.js和它的插件vue-video-player

一:Video.js

需求:对于简单的视频播放需求来说,video.js足以胜任了。

它可是支持HTML5和Flash的视频播放器呦。

1:安装video.js

npm install -s video.js

2:在main.js文件中引入相关文件

import Video from 'video.js'
import 'video.js/dist/video-js.css'
Vue.prototype.$video = Video

3:在组件中使用

<template>
 <div class="video_text">
  <video
   id="myVideo"
   class="video-js"
  >
   <source
    :src="videoUrl"
    type="video/mp4"
   >
  </video>
 </div>
</template>
<script>
 export default {
  name: "Video",
  data() {
   return {
    videoUrl:'...',//视频地址
   };
  },
  mounted() {
   this.initVideo(); //初始化视频播放器
  },
  methods: {
   initVideo() {
    //初始化视频方法
    let myPlayer = this.$video(myVideo, {
     //是否显示控制栏
     controls: true,
     //是否自动播放,muted:静音播放
     autoplay: false,
     //是否静音播放
     muted:false,
     //是否流体自适应容器宽高
     fluid:true,
     //设置视频播放器的显示宽度(以像素为单位)
     width: "800px",
     //设置视频播放器的显示高度(以像素为单位)
     height: "400px"
    });
   }
  }
 };
</script>
<style lang="less">
 .video_text{
  width: 70%;
  margin: 0 auto;
 }
 video:focus{
  outline: 0;   //去掉选中蓝框
 }
 .video-js .vjs-big-play-button{
  /*对播放按钮的样式进行设置*/
  width: 100px;
  height: 60px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate3d(-50%,-50%,0);
 }
</style>

4:效果图

5:附上video.js的一些基本方法

myPlayer.ready(function(){
 //视频播放器初始化完成后的回调函数,this代表当前播放器,可以在这进行一系列的操作(myPlayer为我视频播放器对象)
 myPlayer.play(); //播放
 myPlayer.pause(); //暂停
 var currentTime = myPlayer.currentTime(); //当前播放进度
 myPlayer.currentTime(120); //自定义修改当前进度
 var duration = myPlayer.duration(); //加载完成视频后就可以获取视频总时长了,注意:在flash情况下无效!
 var buffered = myPlayer.buffered(); //视频缓冲,返回值为下载了多大文件
 var bufferedPercent = myPlayer.bufferedPercent(); //视频缓冲,返回值为下载了百分之几
 var volume = myPlayer.volume(); //获取视频音量大小,值在0-1之间
 myPlayer.volume(0.2); //设置视频音量大小
 var width = myPlayer.width(); //获取视频的宽度
 myPlayer.width(640); //设置视频的宽度
 var howTallIsIt = myPlayer.height(); //获取视频的高度
 myPlayer.height(200); //设置视频高度
 myPlayer.size(640,480); //同时设置视频高宽
 myPlayer.enterFullScreen(); //视频全屏显示
 myPlayer.enterFullScreen(); //视频退出全屏显示
})

除此之外,我们还可以绑定监听事件:

//视频播放完毕的回调事件
myPlayer.on("ended", function(){
 console.log("end", this.currentTime());
});
//视频暂停的回调事件
myPlayer.on("pause", function(){
 console.log("pause")
});
//视频删除事件
myPlayer.removeEvent(“eventName”, function(){
 console.log("delete")
});

二:vue-video-player

1:下载vue-video-player

npm install -s vue-video-player

2:在main.js中引入相关文件

import VideoPlayer from 'vue-video-player'
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')
//引入 hls,视频直播(m3u8)必须引入的
import 'videojs-contrib-hls'
//播放rtmp视频
import 'videojs-flash'
//如果你需要自定义播放器的样式,自己新建一个css
require('./assets/css/video_css/myvideo.css')
Vue.use(VideoPlayer)

3:组件中使用(有点长,其实多数是列出的一些回调函数而已,不需要使用的话忽略掉即可)

<template>
 <div class="my_video">
  <video-player class="video-player vjs-custom-skin"
          ref="videoPlayer"
          :playsinline="true"
          :options="videoPlayerOptions"
          @play="onPlayerPlay($event)"
          @pause="onPlayerPause($event)"
          @ended="onPlayerEnded($event)"
          @waiting="onPlayerWaiting($event)"
          @playing="onPlayerPlaying($event)"
          @loadeddata="onPlayerLoadeddata($event)"
          @timeupdate="onPlayerTimeupdate($event)"
          @canplay="onPlayerCanplay($event)"
          @canplaythrough="onPlayerCanplaythrough($event)"
          @statechanged="playerStateChanged($event)"
          @ready="playerReadied"
  ></video-player>
 </div>
</template>

<script>
 // 导入组件
 import {videoPlayer} from 'vue-video-player'

 export default {
  name: 'VideoPlayer',
  components: {
   videoPlayer
  },
  data () {
   return {
    video:'',     //具体视频
    fileType: 'mp4', // 资源的类型
    videoUrl: '', // 资源的路径地址
    posterUrl:'' //封面地址
   }
  },
  mounted(){

  },
  methods:{
   // 播放回调
   onPlayerPlay(player) {
    //console.log('player play!', player)
   },

   // 暂停回调
   onPlayerPause(player) {
    //console.log('player pause!', player)
   },

   // 视频播完回调
   onPlayerEnded($event) {
    this.$refs.videoPlayer.player.src(this.fileUrl)
   },

   // DOM元素上的readyState更改导致播放停止
   onPlayerWaiting($event) {
    //console.log(player)
   },

   // 已开始播放回调
   onPlayerPlaying($event) {
    // console.log(player)
   },

   // 当播放器在当前播放位置下载数据时触发
   onPlayerLoadeddata($event) {
    // console.log(player)
   },

   // 当前播放位置发生变化时触发。
   onPlayerTimeupdate($event) {
    //console.log(player)
   },

   //媒体的readyState为HAVE_FUTURE_DATA或更高
   onPlayerCanplay(player) {
    // console.log('player Canplay!', player)
   },

   //媒体的readyState为HAVE_ENOUGH_DATA或更高。这意味着可以在不缓冲的情况下播放整个媒体文件。
   onPlayerCanplaythrough(player) {
    // console.log('player Canplaythrough!', player)
   },

   //播放状态改变回调
   playerStateChanged(playerCurrentState) {
    //console.log('player current update state', playerCurrentState)
   },

   //将侦听器绑定到组件的就绪状态。与事件监听器的不同之处在于,如果ready事件已经发生,它将立即触发该函数。。
   playerReadied(player) {
    //console.log('example player 1 readied', player);
   },
  },
  computed: {
   videoPlayerOptions () {
    const videoPlayerOptions = {
     playbackRates: [0.75, 1.0, 1.25, 1.5,2.0], //播放速度
     autoplay: false, // 是否自动播放。
     muted: false, // 是否静音播放,默认情况下将会消除任何音频。
     loop: false, // 是否循环播放。
     preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
     language: 'zh-CN',
     aspectRatio: '3:1', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
     fluid: true, // 是否流体从而按比例缩放以适应其容器。
     flash:{hls:{withCreadentials:false}},//可以播放rtmp视频
     html5:{hls:{withCreadentials:false}},//可以播放m3u8视频
     sources: [{
      type: 'video/' + this.fileType,
      src: this.videoUrl // 视频url地址
     }],
     poster: this.posterUrl, // 封面地址
     width: '100%',
     notSupportedMessage: '此视频暂无法播放...', // 当无法播放时允许覆盖Video.js,显示的默认信息。
     controlBar: {
      timeDivider: true,
      durationDisplay: true,
      remainingTimeDisplay: false,
      fullscreenToggle: true
     }
    }
    return videoPlayerOptions
   }
  },
 }
</script>
<style scoped lang="less">
 .my_video{
  width: 100%;
  height: calc(100vh - 100px);
  background-color: white;
 }
 .video-js .vjs-big-play-button{
  /*对播放按钮的样式进行设置*/
  width: 100%;
  height: 100%;
  border-radius: 50%;
 }
</style>

4:效果图

一些改进:

1:消除视频两边留白,也就是实现视频铺满父元素

通过添加样式object-fit:fill;来实现视频铺满

video{
   width: 100% !important;
   height: calc(100vh - 95px) !important;
   object-fit:fill;  //消除留白
  }

效果图:(视频左右两边是没有黑边了的)

补充object-fit取值的相关知识:

fill:此值为boject-fit的默认值,替换内容的大小被设置为填充元素的内容框,也就是说,元素的内容扩大到完全填充容器的外形尺寸,即使这打破其内在的宽高比。

contain:替换元素内容大小保持长宽比例填充元素内容容器,其具体对象大小被解析为一个包含元素的宽度和高度。也就是说,如果你在替换元素上设置一个明确的高度和宽度,此值将导致内容大小,完全在固定的比例显示,但仍在元素尺寸内显示。

cover:替换元素内容大小保持长宽比例填充元素内容容器,其具体对象大小被解析为覆盖整个元素的宽度和高度。也就是说,替换元素内容大小保持长宽比,但改变宽度和高度,以便完全覆盖内容元素。

none:替换元素内容不调整大小以适应内部元素的容器,内容完全忽略设置在元素上的任何高度和权重,并且仍在元素尺寸内显示。 scale-down:当内容大小设置了none或contain,将导致具体对象变得更小。

2:实现自适应高宽

通过上面设置的fluid:true虽然可以自适应宽高,但有时候需求是规定视频总高度的,如果只是靠fluid来自适应是远远不够的。

我的需求效果图:

pc端:

移动端:

我遇到的问题:

设置video视频高宽100%后,总高度却超出了那个位置的高度,试了很多方法都不行,后来就才去了简单粗暴的方法去解决–修改css样式。(觉得有用再用吧各位)

注意:这里我是去掉了之前在videoPlayerOptions中设置的fluid:true和aspectRatio: '16:10'再改css样式的

html代码:

<div class="my_video">
  <video-player class="video-player vjs-custom-skin"
          id="videoDiv"
          ref="videoPlayer"
          :playsinline="true"
          :webkit-playsinline="true"
          :options="videoPlayerOptions"
  ></video-player>
 </div>

自定义css样式:

@media screen and(min-width:768px){ //pc端视频铺满且占据整个容器的高宽,而移动端不需要视频占据整个高度,因为会拉长视频,很难看

  video{
   width: 100% !important;
   height: calc(100vh - 95px) !important; //我的容器高度设置的是100vh-95px,你们根据你们容器高度设置视频高度即可
   object-fit:fill;  //消除两边留白
  }
 }
 //为了填满整个my_video的高度,设置video外层div高度(就是移动端效果图包含黑色部分和视频部分的整个div),使之为容器高度
 #videoDiv>div{
  height: calc(100vh - 95px) !important;
  overflow: hidden;
 }
 .my_video{  //这是我放视频播放器的容器
  width: 100%;
  height: calc(100vh - 95px);
  background-color: white;
 }

补充知识:vue中使用 vue-video-player的几个问题

video.js 插件在vue中是 vue-video-player;

我们在vue中播放视频可以使用这个插件;

下面简单描述几个使用中的问题,不涉及其他问题:

1、自定义播放处理 , 我们自己如何去触发播放这个事件

2、播放,停止触发的函数相关处理;

3、在安卓的微信中播放视频不能播放的问题;

1、自定义播放,假设现在自己写了一个button, 或者其他什么东西放在视频上方,要求点击这个玩意儿播放视频,

你也可以理解为播放按钮; 那么首先肯定得绑定事件,vue绑定事件就不说了,应该都会,那么在这个绑定的

事件函数中,我们如何去播放视频呢?:this.$refs.videoPlayer.player.play(); 就可以了

2、播放或者停止播放时,我想怎加一些额外的处理,那么可以在 <video-player @play=... @pause...>

如下代码,在相应的函数中处理即可,还有其它的事件也都类似处理;

3、在<video-player :playsinline =....> 设置 playsinline 参数的时候,如果我们设置为true 或者 false 是会出问题的,

所以需要根据情况进行处理,这里的情况一般是微信浏览器的 x5内核,需要设置为 false, 其它的设置为 true 即可;

如果微信的 x5 设置为 true , 那么在安卓中微信环境下是无法播放的,是有问题的;

下面的代码是部分代码,仅供参考设置:

<template>
  <div class="video">
    <video-player class="video-player-box"
         ref="videoPlayer"
         :options="playerOptions"
         :playsinline="playsinline"
         customEventName="customstatechangedeventname"
         @play="onPlayerPlay($event)"
         @pause="onPlayerPause($event)"
    >
    </video-player>
  </div>
</template> 

<script>
import 'video.js/dist/video-js.css'
import { videoPlayer } from 'vue-video-player'

export default {
  name: 'Video',
  props: {
    videoUrl: Object
  },
  data() {
    return{
      playerOptions: {
        playbackRates: [0.7, 1.0, 1.5, 2.0],
        autoplay: false,
        muted: false,
        loop: false,
        preload: 'auto',
        language: 'zh-CN',
        aspectRatio: '16:9',
        fluid: true,
        sources: [{
          type: "video/mp4",
          src: "https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm"
        }],
        poster: "http://localhost/547be638615da10.png",
        width: document.documentElement.clientWidth,
        notSupportedMessage: '此视频暂无法播放,请稍后再试',
        controlBar: {
          timeDivider: true,
          durationDisplay: true,
          remainingTimeDisplay: false,
          fullscreenToggle: true //全屏按钮
        }
      },
      videoButton: require("../video_player.png"),
    }
  },
  components: {
    videoPlayer
  },
  mounted() {

   this.playerOptions.sources[0].src = this.videoUrl.a;
   this.playerOptions.poster = this.videoUrl.b
  },
  computed: {
   player() {
    return this.$refs.videoPlayer.player
   },

   playsinline(){
    var ua = navigator.userAgent.toLocaleLowerCase();
    if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) {
      return false
    }else{
      return true
    }
   }

  },
  methods: {
    clickStartButton: function(){
      this.$refs.videoPlayer.player.play();
    },
    onPlayerPlay(player) {
      this.videoPlayState = true;
    }
  }
}
</script>

以上这篇vue video和vue-video-player实现视频铺满教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue使用video.js进行视频播放功能

    关于video.js video.js是一个拥有h5背景的网络视频播放器,同时支持h5以及Flash视频播放(可加载本地静态资源视频以及网络链接视频) 官网:videojs.com/ 安装 npm  install video.js main.js中引入 import Video from 'video.js' import 'video.js/dist/video-js.css' Vue.prototype.$video = Video 使用 <div class="demo1-vide

  • vue视频播放插件vue-video-player的具体使用方法

    安装 npm install vue-video-player --save 引入 可以全局引入插件,也可以在需要用到该插件的组件内单独引入(二选一) [1]全局引用, 在main.js里面导入并引用 import VideoPlayer from 'vue-video-player' import 'vue-video-player/src/custom-theme.css' import 'video.js/dist/video-js.css' Vue.use(VideoPlayer) [2

  • vue使用video插件vue-video-player的示例

    一.安装插件 npm install vue-video-player --save 二.配置插件 在main.js中全局配置插件 import VideoPlayer from 'vue-video-player' require('video.js/dist/video-js.css') require('vue-video-player/src/custom-theme.css') Vue.use(VideoPlayer) 三.使用插件 在vue组件中的程序如下: <template>

  • vue video和vue-video-player实现视频铺满教程

    网页放置视频播放器,我一般都是用video.js和它的插件vue-video-player 一:Video.js 需求:对于简单的视频播放需求来说,video.js足以胜任了. 它可是支持HTML5和Flash的视频播放器呦. 1:安装video.js npm install -s video.js 2:在main.js文件中引入相关文件 import Video from 'video.js' import 'video.js/dist/video-js.css' Vue.prototype.

  • 如何在vue中使用video.js播放m3u8格式的视频

    @[toc] 注意: "vue": "^2.6.11", "video.js": "^7.10.2", "videojs-contrib-hls": "^5.15.0", "mux.js": "^5.7.0" 一.安装 yarn add video.js yarn add videojs-contrib-hls // 这是播放hls流需要的插件 y

  • vue项目中自定义video视频控制条的实现代码

    最近公司项目中,添加了视频模块,但是产品觉得Video自带的控制条有点LOW,于是自己设计了一个.于是开始了自定义Video控制的采坑之旅.. 首页效果图: 需求描述: 当鼠标放在图片上的时候,自动播放视频,并显示预览进度条,当鼠标移开,显示预览图片,再次hover图片,继续上次播放 视频详情页的效果图: 需求描述: 能自定义的暂停和播放 模仿进度条可实现拖拽播放速度 显示当前时间 能选择倍速 能控制声音 能全屏播放 接下来一步步的实现 首先康康首页的,上结构代码: <div class="

  • Vue中Video标签播放解析后短视频去水印无响应解决

    目录 问题: 情景复现: 链接在Video标签打不开 链接浏览器正常打开 出现的原理 解决方式 前端解决 全局添加标签 Vue单页面添加标签 完美解决: 问题: 发送Ajax请求,请求后端接口解析抖音无水印视频并且展示在页面中,后端已经可以把解析后的访问地址返回,通过浏览器访问该地址也是没有问题的,接着我通过Vue的绑点video的src,预期状态应该是可以被播放的,实际上点击也没反应,查看页面代码也发现video的src已经设置了正确的视频url 情景复现: 前端发送请求到后端接口 我们前端打

  • vue中使用h5 video标签实现弹窗播放本地视频的方法

    目录 1.弹窗的打开关闭 2. 本地视频资源路径的引入 3. 视频播放完毕自动关闭弹窗 4. 视频在弹窗中自适应大小 参考h5 < video >标签的用法 在开发过程中主要涉及到以下几个需要关注的点 1.弹窗的打开关闭 父组件中使用.sync绑定visible属性,可直接在子组件中关闭弹窗更新父组件传入的visible值: // 父组件中引用子组件 <video-modal :visible.sync="showVideoModal"> // 子组件中 <

  • vue结合el-upload实现腾讯云视频上传功能

    起因 根据需求要实现一个视频上传功能,之前采用七牛云上传,小点视频没问题,大体积视频比如600M左右,再考虑到网速等其他原因就会花费半个小时左右. 后来分析到不仅要考虑上传时间的问题,更重要的是要考虑用户使用4G 网络的情况,考虑用户的流量,线上的视频,不能不做压缩转码,就放到页面上,视频不是图片,不能甩到 cdn 上就行了. 要考虑视频大小,pc 移动端适配,转码,还有防盗版等问题. 最终决定使用腾讯云上传视频,我的项目是web端上传,参考以下链接 官网链接:cloud.tencent.com

  • 关于vue.extend和vue.component的区别浅析

    前言 最近一个朋友问我vue.extend和vue.component两者之间有什么区别?突然这么一问竟答不出来,回来想想有必要总结下,所以本文就来给大家介绍关于vue.extend和vue.component的区别,下面话不多说了,来一起看看详细的介绍吧. Vue.extend 返回的是一个"扩展实例构造器",也就是一个预设了部分选项的 Vue 实例构造器 var myVue = Vue.extend({ // 预设选项 }) // 返回一个"扩展实例构造器" /

  • vue搜索和vue模糊搜索代码实例

    1.使用vue来实现一般搜索 <form action="" @submit="submitQuery" class="all_two"> <el-input v-model="input" placeholder="请输入内容" ref="search" style="width:300px;"></el-input> </

  • Vue CLI2升级至Vue CLI3的方法步骤

    以下备忘升级至 Vue CLI 3.x 版本后,将项目目录改为新结构时所需做的一些改动. 1. 卸载与安装 npm uninstall vue-cli -g npm install -g @vue/cli 注:若要使用 Vue CLI 3,需将 Node 版本升级至 8.9 及以上. 当使用 nvm 管理 node 版本时,可以使用如下方式切换至需求的 Node 版本: # 安装 >= 8.9 的某个版本 nvm install 8.12.0 # 在当前 session 中使用该版本 nvm u

  • vue的注意规范之v-if 与 v-for 一起使用教程

    当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中 所以,不推荐v-if和v-for同时使用 使用推荐方式: <ul> <li v-for="user in activeUsers" :key="user.id" > {{ user.name }} </li> </ul> <ul v-if="shouldSh

随机推荐