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. JS点击显示隐藏内容
  2. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新
  3. FFmpeg windows下载安装
  4. Java实现简易的文件的迁移器
  5. 剖析SQL Server2005 SQLCLR代码安全性
  6. 谈谈几个SpringCloud常见面试题及答案
  7. mysql procedure
  8. [转载]想要成为Linux大神,你应该和我一样这样做!
  9. web前端学习(总结/心得)
  10. python预测控制_【模型工具】耦合python和 SWMM的城市排水系统模型预测算法
  11. 在普通用户下进入root用户
  12. e会学c语言程序设计基础网课答案,C程序设计(双语版)习题答案
  13. 快手调整员工福利,​减少房补,增加生育津贴;百度网盘青春版正式上线,被吐槽;雷军回应小米对标苹果遭冷嘲热讽 | EA周报...
  14. 该死的强迫症,教你stm32怎么把杜邦线弄整齐
  15. 一个简单的搜狗微信公众号案例
  16. 实习之路0--设计模式之策略模式的理解(鸭子类例子)
  17. 索尼发布新款VR头盔与FB竞争,暂未公布定价
  18. 联想微型计算机m910q6,一台比较完美的黑苹果小主机 联想M910Q折腾记 opencore EFI分享...
  19. 怎么做百度360今日头条1688搜狗下拉词?宙斯下拉、54小超人下拉、超人2下拉
  20. Android--经典蓝牙(文件传输--socket通信)

热门文章

  1. 【转】百度联盟峰会 李彦宏演讲实录
  2. 面试题|Java基础面试题连环55问(2022版)
  3. To C企业的To B征程:攀登企业协作的云梯
  4. 38个BIM模型(revit文件)
  5. 飞信2010分析 – 给离线好友发送消息
  6. 鸿蒙合香丸吃了好吗,合香丸的功效与副作用有哪些 盘点合香丸的两大作用和两大禁忌...
  7. instr()字符查找函数
  8. 2022-2028年全球激光材料行业收入年复合增长率CAGR为 4.4%
  9. C语言 木乃伊迷宫 队列,广搜,map函数
  10. Python-Django毕业设计预约挂号app(程序+Lw)