基于vue的video播放器的实现示例


Posted in Vue.js onFebruary 19, 2021

当现有video播放器不能满足需求时,需要自己对video进行封装。

video事件

  • loadstart: 在视频开始加载时触发,给currentTime赋值(历史播放记录或0)。
  • durationchange: 元信息已载入或已改变,视频的长度发生了改变。获取到视频长度(duration,并给currentTime赋值(历史播放记录或0))。
  • playing: 在视频开始播放时触发(不论是初次播放、在暂停后恢复、或是在结束后重新开始)。
  • pause: 播放暂停时触发。
  • timeupdate: currentTime改变, 更新播放进度。处理播放进度条
  • seeked: 指定播放位置
  • waiting: 缓冲
  • ended: 播放结束, 重置状态
  • WeixinJSBridgeReady: 在微信中使用video,需要监听weixinJSBridgeReady事件, 在回调函数里执行play()命令。

直播协议

HLS(HTTP Live Streaming)由Apple提出的直播流协议。IOS和高版本Android都支持HLS。HLS主要由.m3u8和.ts两种播放文件。HLS具有高兼容性,高可扩展性,但会直播延时。HLS协议是将直播流分成一段一段的小段视频去下载播放的,所以假设列表里面的包含5个ts文件,每个ts文件包含5秒的视频内容,那么整体的延迟就是25秒。

RTMP(Real Time Messaging Protocol)是Macromedia开发的一套视频直播协议,现在属于Adobe。RTMP基于flash无法在IOS的浏览器里播放,但是实时性比HLS要好。

HTTP-FLV针对于FLV视频格式做的直播分发流,延时低。但移动端不支持。

结论:HTTP-FLV延时低,优先使用。若设备不支持HTTP-FLV,使用flv.js。若设备不支持flv.js,则使用HLS,但HLS延迟大。

封装video

/** HTML **/
<div class="video">
 <!-- video player -->
 <video
  class="video__player"
  ref="videoPlayer"
  preload="auto"
  :autoplay="options.autoplay"
  :muted="options.muted"
  webkit-playsinline="true"
  playsinline="true"
  x-webkit-airplay="allow"
  x5-video-player-type="h5-page"
  x5-video-orientation="portraint"
  style="object-fit:cover;"
 >
  <source :src="options.src" />
 </video>

 <!-- video poster -->
 <div
  v-show="showPoster"
  class="video__poster"
  :style="{'background-image': 'url(' + options.pic + ')'}"
 ></div>

 <!-- video loading -->
 <div v-show="showLoading" class="video__Loading">
  <span class="video__Loading-icon"></span>
 </div>

 <!-- video pause -->
 <div @click="handleVideoPlay" class="video__pause">
  <span v-show="!videoPlay" class="video__pause-icon"></span>
 </div>
</div>
/** js**/
props: {
 options: {
  type: Object,
  default: () => {}
 }
},
data() {
 return {
  videoPlay: false, // 是否正在播放
  videoEnd: false, // 是否播放结束
  showPoster: true, // 是否显示视屏封面
  showLoading: false, // 加载中
  currentTime: 0, // 当前播放位置
  currentVideo: {
   duration: this.options.duration
  },

 }
},
mounted() {
 this.videoPlayer = this.$refs.videoPlayer;
 this.videoPlayer.currentTime = 0;
 
 this.videoPlayer.addEventListener("loadstart", e => {
   this.videoPlayer.currentTime = (this.options.playProcess > 0) ? this.options.playProcess : 0;
 });
 
  // 获取到视频长度
 this.videoPlayer.addEventListener("durationchange", e => {
  this.currentVideo.duration = this.videoPlayer.duration;
  // 存在播放历史记录
  this.videoPlayer.currentTime = (this.options.playProcess > 0) ? this.options.playProcess : 0;
 });
 
 this.videoPlayer.addEventListener("playing", e => {
  this.showPoster = false;
  this.videoPlay = true;
  this.showLoading = false;
  this.videoEnd = false;
 });
 
 // 暂停
 this.videoPlayer.addEventListener("pause", () => {
  this.videoPlay = false;
  if (this.videoPlayer.currentTime < 0.1) {
   this.showPoster = true;
  }
  this.showLoading = false;
 });
 
 // 播放进度更新
 this.videoPlayer.addEventListener("timeupdate", e => {
   this.currentTime = this.videoPlayer.currentTime;
  },
  false
 );

 // 指定播放位置
 this.videoPlayer.addEventListener("seeked", e => {
 });

 // 缓冲
 this.videoPlayer.addEventListener("waiting", e => {
  this.showLoading = true;
 });
 
 // 播放结束
 this.videoPlayer.addEventListener("ended", e => {
  // 重置状态
  this.videoPlay = false;
  this.showPoster = true;
  this.videoEnd = true;
  this.currentTime = this.currentVideo.duration;
 });
 
 // 监听weixinJSBridgeReady事件,处理微信不能自动播放。但并不全部适用,加了暂停按钮,手动播放。
 document.addEventListener('WeixinJSBridgeReady', () => { 
  this.videoPlayer.play();
 }, false);
},
methods: {
 handleVideoPlay() {
  if (this.videoPlayer.paused) { // 播放
   if(this.videoEnd) { // 重播
    this.currentTime = 0;
    this.videoPlayer.currentTime = 0;
   }
   this.videoPlayer.play();
   this.videoPlay = true;
  } else { // 暂停
   this.videoPlayer.pause();
   this.videoPlay = false;
  }
 }
}

[参考文章]:

  • X5内核视频两种播放形态
  • H5直播Video标签坑汇总
  • H5直播入门(理论篇)
  • 全面进阶 H5 直播

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

Vue.js 相关文章推荐
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
vuex的使用和简易实现
Jan 07 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue实现列表垂直无缝滚动
Apr 08 Vue.js
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 #Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 #Vue.js
Vue如何实现变量表达式选择器
Feb 18 #Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 #Vue.js
如何在 Vue 中使用 JSX
Feb 14 #Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 #Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 #Vue.js
You might like
php 特殊字符处理函数
2008/09/05 PHP
解析php中const与define的应用区别
2013/06/18 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
php中apc缓存使用示例
2013/12/25 PHP
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
python set内置函数的具体使用
2019/07/02 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
python自动点赞功能的实现思路
2020/02/26 Python
python实现126邮箱发送邮件
2020/05/20 Python
python 实现aes256加密
2020/11/27 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
雪山饭庄的创业计划书范文
2014/01/18 职场文书
学雷锋月活动总结
2014/04/25 职场文书
会计岗位说明书
2014/07/29 职场文书
大学生见习报告范文
2014/11/03 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
2016春节放假通知范文
2015/08/18 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python