videojs官网: https://videojs.com/getting-started

video.js安装

使用videoJs前势必需要先安装videoJs,目前有两种方式可以使用;

  1. npm包安装工具
npm install video.js --save-dev
npm install videojs-contrib-hls --save
  1. 直接在<head></head>标签里引入需要的videoJs文件
<link href="https://cdn.bootcss.com/video.js/7.6.5/alt/video-js-cdn.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/video.js/6.6.2/video.js"></script><script src="https://cdn.bootcss.com/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script>

video.js引入

  1. 在vue的主入口文件main.js里进行引入
// 引入video.js样式
import "video.js/dist/video-js.css"
import videojs from 'video.js'
import 'videojs-contrib-hls' // 用来播放hls流
import '@videojs/http-streaming'
// 在原型上注册以便在任何地方都可以使用
Vue.prototype.$video = video;
  1. 如果使用改插件的页面不多,可以直接在需要使用的页面进行引入
import videojs from 'video.js'
import 'videojs-contrib-hls'
import '@videojs/http-streaming'

video.js使用

  1. video标签使用

根据业务逻辑设计,我这边的直播链接是用户选择后通过后端动态获取的,因此在HTML部分没有使用<source></source>配置播放地址

<video id="videoBox" playsinline class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid vjs-16-9" controls preload="none"></video>
  1. videoJs初始化,创建播放器
initVideo() {let videoPlayer = videojs("videoBox",{fluid: true, // 扩展以适应其容器的大小bigPlayButton: false, // 是否在暂停时显示大的播放按钮,按钮一般默认在左上角textTrackDisplay: true,posterImage: false, // 是否使用视频的缩略图errorDisplay: false,}, function (){// 回调函数,在播放器创建完成后执行// 这里我用来处理获取到动态视频地址时手动触发播放器播放this.src({src: 'url',type: 'application/x-mpegURL'})this.play()})
}
  1. 一定记得离开页面时销毁组件
videoPlayer.dispose()

注意点:

在开始视频直播时,可能会出现后端下发指令去拉流,但是设备还没上报流的情况,这时候后端给的直播地址并不是有效的,videoJs拉取不到流会报错并停止播放拉流;

对于这种情况,我们可以监听播放器,手动触发其继续获取数据直到成功播放

videoPlayer.on('error', function () {setTimeout(() => {this.src({src: url,type: 'application/x-mpegURL'})this.play()}, 5000)
})

videoJs常用配置

  1. autoplay : true/false 播放器准备好之后,是否自动播放
  2. controls : true/false 是否拥有控制条 【默认true】,如果设为false ,那么只能通过api进行控制了。也就是说界面上不会出现任何控制按钮
  3. height: 视频容器的高度,字符串或数字、单位像素
  4. width: 视频容器的宽度, 字符串或数字 单位像素
  5. loop : true/false 视频播放结束后,是否循环播放
  6. muted : true/false 是否静音
  7. poster: 播放前显示的视频画面,播放开始之后自动移除。通常传入一个URL
  8. preload:预加载
    ‘auto‘ 自动
    ’metadata‘ 元数据信息 ,比如视频长度,尺寸等
    ‘none‘ 不预加载任何数据,直到用户开始播放才开始下载
  9. children: Array | Object 可选子组件 从基础的Component组件继承而来的子组件,数组中的顺序将影响组件的创建顺序哦。
  10. posterImage : true/false 在未播放前是否显示缩略图
  11. poster 配置缩略图地址
  12. bigPlayButton : true/false 是否显示播放的大图标

videoJs常用监听

videoPlayer.controlBar.playToggle.on('click', () => {// 监听播放暂停按钮的点击
})
videoPlayer.tech_.on('click', () => {// 监听视频内容里的点击
})
videoPlayer.bigPlayButton.on('click', ()=> {// 监听播放按钮大图标
})
videoPlayer.on('play', () => {// 监听视频开始播放
})
videoPlayer.on('pause', () => {// 监听视频暂停
})
videoPlayer.on('canplaythrough', function (){// 监听视频加载完成
})
videoPlayer.on('error', function () {// 监听视频获取失败
})

通过样式修改video.js播放按钮、控件

  1. 播放按钮大图标居中显示

<video></video>标签增加vjs-big-play-centered

<video id="videoBox" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid vjs-16-9"></video>
  1. 播放按钮样式修改
.video-js .vjs-big-play-button{}
  1. 暂停时显示播放按钮
.vjs-paused .vjs-big-play-button,
.vjs-paused.vjs-has-started .vjs-big-play-button {display: block;
}
  1. 禁止视频在苹果电脑自动全屏,需在标签上配置playsinline
<video id="videoBox" playsinline class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid vjs-16-9"></video>
  1. videoJs插件播放视频时,进度条默认显示的剩余时间,若想要显示总时间和已播放的时间,可以修改下css,如图:
::v-deep.video-js .vjs-time-control {display: block;
}
::v-deep.video-js .vjs-remaining-time {display: none;
}
  1. 使用自定义的视频缩略图时,可能会出现视频大小和缩略图不匹配,导致出现黑边的情况,可以设置样式去掉黑边
::v-deep .video-js .vjs-tech {object-fit: fill;
}
::v-deep .vjs-poster {background-size: cover;
}

语言切换

实现video.js语言与系统语言保持一致;

首先把需要的几种语言引入并添加到插件中(这里我只用了中英文)

// main.js
import "video.js/dist/video-js.css"
import lang_zhcn from "video.js/dist/lang/zh-CN.json"
import en_US from "video.js/dist/lang/en.json"videojs.addLanguage('zh_CN', lang_zhcn)
videojs.addLanguage('en_US', en_US)
Vue.prototype.$videojs = videojs;

然后在初始化video.js时配置语言

this.videoPlayer = this.$videojs("videoBox",{// 获取系统当前语言并配置language: this.$store.state.language,}, () => {})

遇到的问题

由于业务要求,需要在播放视频结束后将视频播放器恢复到初始状态,即停止播放并显示封面图;查看了文档,有一个reset方法是重置用的,使用后发现是能达到恢复播放器相关参数为默认值,但是不能显示封面图;经过对播放器生成的dom元素的观察,发现封面图是否显示是由两个类控制的,分别是.vjs-has-started.vjs-hidden,因此我们可以通过清除这两个类实现显示封面图;具体实现方式如下:

  this.videoPlayer.pause() // 根据情况,我这边会有在播放中触发初始化的情况,所以加了个暂停this.videoPlayer.src('')this.videoPlayer.reset() // 重置this.videoPlayer.posterImage.setSrc(require('@/assets/img/video_template_bg.png')) // 发现重置后一开始设置的封面图会被清空,这里需要重新设置下this.videoPlayer.posterImage.show() // 移除`.vjs-hidden`document.getElementsByClassName('video-js')[0].classList.remove('vjs-has-started') // 移除`.vjs-has-started`

VideoJS实现视频直播(vue)相关推荐

  1. 在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS)

    在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS) 第一步 用npm装这个几个包 "video.js": "^6.6.0&quo ...

  2. 在vue中使用海康插件实现视频监控视频直播方法二(RTMP流加Flash加swf)

    在vue中使用海康威视实现视频监控,视频直播方法二(RTMP流加Flash加swf) 第一步 用npm装这个几个包 "video.js": "^6.6.0",& ...

  3. vue实现rtsp视频直播流

    实现摄像头的直播功能其实有许多方案,像是安装vlc插件.rtsp转rtmp然后使用videojs通过flash播放rtmp**(由于chrome已经不使用flash所以放弃使用videojs,并且vi ...

  4. vue使用vue-video-player实现web视频直播展示m3u8格式

    最近有一个需求,就是web展示摄像头的实时画面,mentor让我先探索探索,所以我先测试一些小demo. 这里边个人想了一下啊,还是比较复杂的,包含推流和拉流等操作,还有延迟的问题要解决. 自己主要负 ...

  5. videojs实现视频打点标记 Vue

    videojs实现视频打点标记 Vue 安装 npm install videojs npm install videojs-markers 页面引入 import videojs from 'vid ...

  6. 基于android的防抖音直播,uniapp 仿火山 / 抖音短视频|uni-App+vue 直播实例

    项目简介 U直播是一个基于uniapp+vue+nvue+vuex等技术实现的小视频/直播界面/聊天等功能的跨端项目,分别仿制了抖音小视频.陌陌直播界面功能,可实现上下滑动切换播放.暂停,评论.商品等 ...

  7. 视频直播m3u8协议以及跨域问题和Videojs加载m3u8视频汇总

    video.js支持m3u8格式直播 https://www.cnblogs.com/saysmy/p/6429835.html 为什么要使用video.js? 1. PC端浏览器并不支持video直 ...

  8. Vue + WebRTC 实现音视频直播(附自定义播放器样式)

    1. 什么是WebRTC 1.1 WebRTC简介 WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频 ...

  9. 91.video.ws index php_如何利用videojs实现视频列表循环播放(完整代码)

    本篇文章给大家带来的内容是关于如何利用videojs实现视频列表循环播放(完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 庭审直播 .video-js { /* posit ...

最新文章

  1. 微博并发这么牛逼!看他架构如何设计的?
  2. Delphi - 数组 详解
  3. js获取被点击的元素以及子元素
  4. Linux搭建虚拟机,桥接模式下,主机能够Ping通虚拟机,虚拟机ping不通主机
  5. Flask-RESTful 快速入门
  6. python学习高级篇(part10)--类对象的特殊方法和特殊属性
  7. python扫地机器人开发学校_扫地机器人源码及解释
  8. console 调试javascript
  9. java linux runtime 正则表达式_Java学习之正则表达式
  10. 鸿蒙系统是噱头和谈判策略?华为梁华:是针对IoT的操作系统
  11. 一个企业为什么执行不力?
  12. 机器学习之支持向量机算法(一)
  13. node.js与python_Node.js与Python
  14. sqlserver一个循环圆的算法
  15. PTA Huffman树及其应用题
  16. Verilog学习之路(7)— 数字加法器
  17. CF1463-A. Dungeon
  18. 无法访问eclipse官网?镜像源可以帮你
  19. 反思:安全需要新体系
  20. 关于数据分析的一些实例报告

热门文章

  1. Virtual BOX或VMware和PC宿主机间不插网线通过loopback建立连接解决无网络情况下通信
  2. Redis的简单笔记
  3. 处理Byte字节的工具---ByteUtil
  4. Android使用MediaCodec解码H264视频解码器
  5. 16GB ipad wifi版行货价格接近港行
  6. 认识自己所承受的压力
  7. [转]DirectShow应用——视频捕捉WDM Vs VFW
  8. 五道口计算机学院怎么回事,五道口技术学院是什么?五道口技术学院是个什么梗?...
  9. pytorch 分批训练
  10. 网站关键词排名丢失了该如何解决?