VideoJS实现视频直播(vue)
videojs官网: https://videojs.com/getting-started
video.js安装
使用videoJs前势必需要先安装videoJs,目前有两种方式可以使用;
- npm包安装工具
npm install video.js --save-dev
npm install videojs-contrib-hls --save
- 直接在
<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引入
- 在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;
- 如果使用改插件的页面不多,可以直接在需要使用的页面进行引入
import videojs from 'video.js'
import 'videojs-contrib-hls'
import '@videojs/http-streaming'
video.js使用
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>
- 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()})
}
- 一定记得离开页面时销毁组件
videoPlayer.dispose()
注意点:
在开始视频直播时,可能会出现后端下发指令去拉流,但是设备还没上报流的情况,这时候后端给的直播地址并不是有效的,videoJs拉取不到流会报错并停止播放拉流;
对于这种情况,我们可以监听播放器,手动触发其继续获取数据直到成功播放
videoPlayer.on('error', function () {setTimeout(() => {this.src({src: url,type: 'application/x-mpegURL'})this.play()}, 5000)
})
videoJs常用配置
autoplay : true/false
播放器准备好之后,是否自动播放controls : true/false
是否拥有控制条 【默认true】,如果设为false ,那么只能通过api进行控制了。也就是说界面上不会出现任何控制按钮height
: 视频容器的高度,字符串或数字、单位像素width
: 视频容器的宽度, 字符串或数字 单位像素loop : true/false
视频播放结束后,是否循环播放muted : true/false
是否静音poster
: 播放前显示的视频画面,播放开始之后自动移除。通常传入一个URLpreload
:预加载
‘auto‘ 自动
’metadata‘ 元数据信息 ,比如视频长度,尺寸等
‘none‘ 不预加载任何数据,直到用户开始播放才开始下载children: Array | Object
可选子组件 从基础的Component组件继承而来的子组件,数组中的顺序将影响组件的创建顺序哦。posterImage : true/false
在未播放前是否显示缩略图poster
配置缩略图地址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播放按钮、控件
- 播放按钮大图标居中显示
在<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>
- 播放按钮样式修改
.video-js .vjs-big-play-button{}
- 暂停时显示播放按钮
.vjs-paused .vjs-big-play-button,
.vjs-paused.vjs-has-started .vjs-big-play-button {display: block;
}
- 禁止视频在苹果电脑自动全屏,需在标签上配置
playsinline
<video id="videoBox" playsinline class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid vjs-16-9"></video>
- videoJs插件播放视频时,进度条默认显示的剩余时间,若想要显示总时间和已播放的时间,可以修改下css,如图:
::v-deep.video-js .vjs-time-control {display: block;
}
::v-deep.video-js .vjs-remaining-time {display: none;
}
- 使用自定义的视频缩略图时,可能会出现视频大小和缩略图不匹配,导致出现黑边的情况,可以设置样式去掉黑边
::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)相关推荐
- 在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS)
在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS) 第一步 用npm装这个几个包 "video.js": "^6.6.0&quo ...
- 在vue中使用海康插件实现视频监控视频直播方法二(RTMP流加Flash加swf)
在vue中使用海康威视实现视频监控,视频直播方法二(RTMP流加Flash加swf) 第一步 用npm装这个几个包 "video.js": "^6.6.0",& ...
- vue实现rtsp视频直播流
实现摄像头的直播功能其实有许多方案,像是安装vlc插件.rtsp转rtmp然后使用videojs通过flash播放rtmp**(由于chrome已经不使用flash所以放弃使用videojs,并且vi ...
- vue使用vue-video-player实现web视频直播展示m3u8格式
最近有一个需求,就是web展示摄像头的实时画面,mentor让我先探索探索,所以我先测试一些小demo. 这里边个人想了一下啊,还是比较复杂的,包含推流和拉流等操作,还有延迟的问题要解决. 自己主要负 ...
- videojs实现视频打点标记 Vue
videojs实现视频打点标记 Vue 安装 npm install videojs npm install videojs-markers 页面引入 import videojs from 'vid ...
- 基于android的防抖音直播,uniapp 仿火山 / 抖音短视频|uni-App+vue 直播实例
项目简介 U直播是一个基于uniapp+vue+nvue+vuex等技术实现的小视频/直播界面/聊天等功能的跨端项目,分别仿制了抖音小视频.陌陌直播界面功能,可实现上下滑动切换播放.暂停,评论.商品等 ...
- 视频直播m3u8协议以及跨域问题和Videojs加载m3u8视频汇总
video.js支持m3u8格式直播 https://www.cnblogs.com/saysmy/p/6429835.html 为什么要使用video.js? 1. PC端浏览器并不支持video直 ...
- Vue + WebRTC 实现音视频直播(附自定义播放器样式)
1. 什么是WebRTC 1.1 WebRTC简介 WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频 ...
- 91.video.ws index php_如何利用videojs实现视频列表循环播放(完整代码)
本篇文章给大家带来的内容是关于如何利用videojs实现视频列表循环播放(完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 庭审直播 .video-js { /* posit ...
最新文章
- 微博并发这么牛逼!看他架构如何设计的?
- Delphi - 数组 详解
- js获取被点击的元素以及子元素
- Linux搭建虚拟机,桥接模式下,主机能够Ping通虚拟机,虚拟机ping不通主机
- Flask-RESTful 快速入门
- python学习高级篇(part10)--类对象的特殊方法和特殊属性
- python扫地机器人开发学校_扫地机器人源码及解释
- console 调试javascript
- java linux runtime 正则表达式_Java学习之正则表达式
- 鸿蒙系统是噱头和谈判策略?华为梁华:是针对IoT的操作系统
- 一个企业为什么执行不力?
- 机器学习之支持向量机算法(一)
- node.js与python_Node.js与Python
- sqlserver一个循环圆的算法
- PTA Huffman树及其应用题
- Verilog学习之路(7)— 数字加法器
- CF1463-A. Dungeon
- 无法访问eclipse官网?镜像源可以帮你
- 反思:安全需要新体系
- 关于数据分析的一些实例报告