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


Posted in Javascript onOctober 30, 2020

网页放置视频播放器,我一般都是用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:效果图

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

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:效果图

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

一些改进:

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

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

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

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

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

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

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

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

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

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

2:实现自适应高宽

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

我的需求效果图:

pc端:

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

移动端:

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

我遇到的问题:

设置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实现视频铺满教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery插件之easing 动态菜单
Aug 21 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
Jun 27 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
js算法中的排序、数组去重详细概述
Oct 14 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
纯js实现重发验证码按钮倒数功能
Apr 21 Javascript
深入理解JavaScript编程中的同步与异步机制
Jun 24 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
详解Angular4 路由设置相关
Aug 26 Javascript
jQuery插件artDialog.js使用与关闭方法示例
Oct 09 jQuery
详解小程序开发经验:多页面数据同步
May 18 Javascript
Echarts.js无法引入问题解决方案
Oct 30 #Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 #Javascript
vue 通过 Prop 向子组件传递数据的实现方法
Oct 30 #Javascript
微信小程序:报错(in promise) MiniProgramError
Oct 30 #Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
Oct 30 #Javascript
vuecli项目构建SSR服务端渲染的实现
Oct 30 #Javascript
Javascript文本框脚本实现方法解析
Oct 30 #Javascript
You might like
php 启动时报错的简单解决方法
2014/01/27 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
PHP实现的json类实例
2015/07/28 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
7个JS基础知识总结
2014/03/05 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
vue实现页面滚动到底部刷新
2019/08/16 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
如何利用python查找电脑文件
2018/04/27 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
军训心得体会
2013/12/31 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
颐和园导游词
2015/01/30 职场文书
会议通知
2015/04/15 职场文书
三八节活动主持词
2015/07/04 职场文书