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与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
Vue图片裁剪组件实例代码
Jul 02 Vue.js
Vue全局事件总线你了解吗
Feb 24 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
vue/cli 配置动态代理无需重启服务的方法
May 20 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
中国收音机工业发展史
2021/03/02 无线电
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
Python选课系统开发程序
2016/09/02 Python
深入理解Python对Json的解析
2017/02/14 Python
Python判断有效的数独算法示例
2019/02/23 Python
python flask中动态URL规则详解
2019/11/22 Python
python返回数组的索引实例
2019/11/28 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python dict如何定义
2020/09/02 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
New Balance美国官网:运动鞋和健身服装
2017/04/11 全球购物
品恩科技软件测试面试题
2014/10/26 面试题
四查四看自我剖析材料
2014/09/19 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
学年个人总结范文
2015/03/05 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
阿甘正传观后感
2015/06/01 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
党员心得体会范文2016
2016/01/23 职场文书
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers