vue-video-player 断点续播的实现


Posted in Vue.js onFebruary 01, 2021

最近的项目中需要实现视频断点续播的功能,一听到这个功能。内心方张了..但却又有点小窃喜,小懵乱。抱着求学态度去挑战一下。

1.安装插件

npm install vue-video-player --save

2.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)

3.页面使用组件

<el-tree :data="ChapterOptions"
     :props="defaultProps"
     node-key='id'
     highlight-current
     :filter-node-method="filterNode"
     ref="tree"
     default-expand-all
     @node-click="handleNodeClick" />
<video-player ref="videoPlayer"
        class="video-player vjs-custom-skin"
        style="width: 1000px;height: 576px;display: inline-flex"
        :playsinline="true"
        :options="playerOptions"
        @pause="onPlayerPause($event)"
        @ended="onPlayerEnded($event)"
        @play="onPlayerPlay($event)"
        @timeupdate="onPlayerTimeupdate($event)"
        @ready="playerReadied"
    />
<script>
import { videoPlayer } from 'vue-video-player'
import 'video.js/dist/video-js.css'
import 'vue-video-player/src/custom-theme.css'
import { treeselect } from "@/api//driver/videoChapter";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
 name: "videoPlayer",
 components: { Treeselect,videoPlayer },
 data() {
 return {
  //用户信息
  user:{},
  //===============================
  paused: true,
  learningDuration: {
  userId: '', //用户id
  chapterId:'',//章节id
  timeLog: '', //视频观看时长
  },
 
  playerOptions: {
  playbackRates: [0.5, 1.0, 1.5, 2.0], //播放速度
  autoplay: false, // 如果true,浏览器准备好时开始回放。
  muted: false, // 默认情况下将会消除任何音频。
  loop: false, // 导致视频一结束就重新开始。
  preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
  language: 'zh-CN',
  aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
  fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
  sources: [
   {
   type: 'video/mp4', // 这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目
   src: ''// url地址
   }
  ],
  hls: true,
  poster: '', // 你的封面地址
  width: document.documentElement.clientWidth, // 播放器宽度
  notSupportedMessage: '此视频暂无法播放,请稍后再试', // 允许覆盖Video.js无法播放媒体源时显示的默认信息。
  controlBar: {
   //当前时间和持续时间的分隔符
   timeDivider: true,
   //显示持续时间
   durationDisplay: true,
   //是否显示剩余时间功能
   remainingTimeDisplay: false,
   //全屏按钮
   fullscreenToggle: true
  }
  }
 };
},
computed: {
 player() {
  return this.$refs.videoPlayer.player//自定义播放
 }
 },
mounted () {
 this.timer = setInterval(this.putLearningObj, 3000)
 },
destroyed () {
 // 如果定时器在运行则关闭
 if (this.timer) {
  clearInterval(this.timer)
  }
 },
methods: {
 //用户信息
 getUser() {
  getUserProfile().then(response => {
  this.user = response.data;
  this.learningDuration.userId = this.user.userId
  });
 },
  //============================
 fullScreen() {
  const player = this.$refs.videoPlayer.player
  player.requestFullscreen()//调用全屏api方法
  player.isFullscreen(true)
  player.play()
 },
 onPlayerPlay(player) {
  this.paused = false
  // player.play()
 },
 onPlayerPause (player) {
  this.paused = true
  // console.log('onPlayerPause!', player)
 },
 onPlayerEnded (player) {
  this.paused = false;
  // clearInterval(this.timer);
 },
 //当前播放位置发生变化时触发。
 onPlayerTimeupdate (player) {
  // console.log(' onPlayerTimeupdate!', this.timeLog)
 },
 /* 设置视频进度 */
 playerReadied: function (player) {
 },
};
</script>

上面的 src视频地址可以换成具体的地址串,也能换成后台的地址串,因为我的是章节树所以我和章节id进行了关联

/** 查询部门下拉树结构 */
 getTreeselect() {
  treeselect().then((response) => {
  //封面
  var img = '';
  this.ChapterOptions = response.data;
  for (let i = 0; i <this.ChapterOptions.length ; i++) {
   this.videoName = this.ChapterOptions[0].children[0].chapterName
   this.videoIntroduce = this.ChapterOptions[0].children[0].chapterIntroduce
   this.VideoUrl = JSON.parse(this.ChapterOptions[0].children[0].videoAddress)
   img = JSON.parse(this.ChapterOptions[0].children[0].imageAddress)
   //初始化封面
   for (let j = 0; j <img.length ; j++) {
   this.playerOptions.poster =img[0];
   }
   //初始化第一个章节视频
   for (let j = 0; j <this.VideoUrl.length ; j++) {
   this.playerOptions.sources[0].src = this.VideoUrl[0]
   }
   //初始化章节
   this.learningDuration.chapterId = this.ChapterOptions[0].children[0].id;
   //默认高亮第一个章节节点
   this.$nextTick(()=>{
   this.$refs.tree.setCurrentKey(this.ChapterOptions[0].children[0].id);
   })
  }
  });
 },
 // 筛选节点
 filterNode(value, data) {
  if (!value) return true;
  return data.label.indexOf(value) !== -1;
 },
 // 节点单击事件
 handleNodeClick(data) {
  // console.log(data)
  var img = '';
  //刷新原视频, 原封面
  this.playerOptions.sources[0].src = '';
  this.playerOptions.poster = '';
  //转换视频
  this.VideoUrl= JSON.parse(data.videoAddress);
  // console.log("this.VideoUrl")
  for (let i = 0; i <this.VideoUrl.length ; i++) {
  this.playerOptions.sources[0].src = this.VideoUrl[0];
  }
  img = JSON.parse(data.imageAddress);
  for (let i = 0; i <img.length ; i++) {
  this.playerOptions.poster = img[0];
  }
  // console.log("this.playerOptions.sources[0].src")
  // console.log(this.playerOptions.sources[0].src)
  //章节介绍
  this.videoIntroduce = data.chapterIntroduce;
  //章节名称
  this.videoName = data.chapterName;
  //章节id
  this.learningDuration.chapterId = data.id
  // console.log(this.videoIntroduce)
 },

4.进度保存

接下来就是 保存视频的进度条了,通过打印发现onPlayerTimeupdate可获取到视频的进度,故采用定时器 每3秒触发一次数据交互

computed: {
 player() {
  return this.$refs.videoPlayer.player//自定义播放
 }
 },
 mounted () {
 this.timer = setInterval(this.putLearningObj, 3000)
 },
 destroyed () {
 // 如果定时器在运行则关闭
 if (this.timer) {
  clearInterval(this.timer)
  }
 },
methods: {  
putLearningObj () {
  if (!this.paused) {
  //保存视频进度
  saveTime(this.learningDuration)
  console.log('putLearningObj ~~~~~~~~~')
  }
 },
//当前播放位置发生变化时触发。
onPlayerTimeupdate (player) {
 this.learningDuration.timeLog = player.cache_.currentTime
  // console.log(' onPlayerTimeupdate!', this.timeLog)
 },
},

saveTime是我自定义的与后端交互的方法。(可自行定义)

// 保存视频进度
export function saveTime(data) {
 return request({
 url: '/***/****/***/',
 method: 'put',
 data: data
 })
}

那么到了这一步 进度就能保存下来了

4.进度恢复

想要恢复进度,就必须在视频播放前把 保存进度下来的设置到视频当中,通过打印可以看出playerReadied 可以设置

/* 设置视频进度 */
playerReadied: function (player) {
//可在此调用后台交互方法
...
player.currentTime(this.learningDuration.timeLog)
},

到此 进度可以 恢复了 大功告成!。至于后台交互数据 需求不一样,代码也就没有贴出来。

vue-video-player 断点续播的实现

到此这篇关于vue-video-player 断点续播的文章就介绍到这了,更多相关vue video player 断点续播内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
详解vue 组件注册
Nov 20 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
Vue SPA 首屏优化方案
Feb 26 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
vue3种table表格选项个数的控制方法
Apr 14 Vue.js
Vite和Vue CLI的优劣
Jan 30 #Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 #Vue.js
vue监听键盘事件的相关总结
Jan 29 #Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 #Vue.js
vue 项目@change多个参数传值多个事件的操作
Jan 29 #Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 #Vue.js
聊聊vue 中的v-on参数问题
Jan 29 #Vue.js
You might like
windows xp下安装pear
2006/12/02 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
Using the TextRange Object
2006/10/14 Javascript
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
Python多进程机制实例详解
2015/07/02 Python
Python命令行解析模块详解
2018/02/01 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
sklearn+python:线性回归案例
2020/02/24 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
博士生入学考试推荐信
2013/11/17 职场文书
委托公证书
2014/04/08 职场文书
银行求职信怎么写
2014/05/26 职场文书
法定代表人授权委托书
2014/09/19 职场文书
岗位职责范本大全
2015/02/26 职场文书
兴趣班停课通知
2015/04/24 职场文书
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers