基于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 elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
解决vue中provide inject的响应式监听
Apr 19 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面向对象编程快速入门
2006/10/09 PHP
php&amp;java(一)
2006/10/09 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
php 中的closure用法详解
2017/06/12 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
javascript 文档的编码问题解决
2009/03/01 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
Python分割指定页数的pdf文件方法
2018/10/26 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
学习雷锋演讲稿
2014/05/10 职场文书
大学迎新标语
2014/06/26 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
西岭雪山导游词
2015/02/06 职场文书
经销商会议开幕词
2016/03/04 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL