Video.js 是一个通用的在网页上嵌入视频播放器的 JS 库,Video.js 自动检测浏览器对 HTML5 的支持情况,如果不支持 HTML5 则自动使用 Flash 播放器。支持mp4、webm、ogv视频格式,也能够插入字幕(要支持ie低版本请下载5.4.3版 )点击进入官网
下载
各个版本下载
使用
引入文件
1 2 | <link href="//vjs.zencdn.net/4.9/video-js.css" rel="stylesheet"> <script src="//vjs.zencdn.net/4.9/video.js"></script> |
设置flash路径,Video.js会在不支持html5的浏览中使用flash播放视频文件。
1 2 3 | <script> videojs.options.flash.swf = "video-js.swf"; </script> |
HTML
编写html网页的video元素关键在于设置video的属性。通过设置video的属性可以控制视频播放器按你的要求展示。
class属性:第一个参数video-js是必须的,这个属性让video.js知道,要让它来控制这个视频的样式以及功能; 第二个参数用来说明播放器的外观,默认只提供了一种外观“vjs-default-skin”,如果你需要自定义外观就可以将他设置为其他的值 有点让人不习惯的是,video.js的作者认为播放键放在中间会遮住内容,于是把它移到了左上方,但这实在有违对称的美感。不过幸好,它提供了一个参数将播放键改回中央:“vjs-big-play-centered” width和height参数用来指示播放器的长和高,没什么可说的 有preload参数来控制视频的加载,其值为”auto”时视频随网页自动自动加载,”none”时不预先加载 它还允许设置视频播放前的封面,当然如果你不指定会是视频的第一帧,其值为封面图片的地址。 这是一个video.js提供的样例,一般不需要什么修改。
1 2 3 4 5 6 7 8 | <video id="example_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264" poster="http://video-js.zencoder.com/oceans-clip.png" data-setup='{ }'> <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' /> <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' /> <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' /> </video> |
如果你还对播放按钮样式不满意可重新定义
初始化
Video.js初始化有两种方式。
1、标签方式
一种是在
2、JS方式 (为动态加载的 HTML 元素设置 Video.js)
如果你的 web 页面或者应用是动态加载 video 标签的(ajax,appendChild,等等),这样在页面加载后这个元素是不存在的,那么你会想要手动设置播放器而不是依靠
1、将 data-setup 属性从 video 标签中移除掉,避免播放器混乱。并且需要传入
2、如果你不想使用自动设置,你可以忽略data-setup属性,并用videojs函
数初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 | var options = {}; var player = videojs('my-player', options, function onPlayerReady() { videojs.log('Your player is ready!'); // In this context, `this` is the player that was created by Video.js. this.play(); // How about an event listener? this.on('ended', function() { videojs.log('Awww...over so soon?!'); }); }); |
- videojs 方法中的第一个参数是你的 video 标签的 ID,用你自己的代替。
- 第二个参数是一个选项对象。它允许你像设置 data-setup 属性一样设置额外的选项。
- 第三个参数是一个 'ready' 回调。一旦 Video.js 初始化完成后,就会触发这个回调。
播放按钮居中
video.js默认的播放按钮在左上角,应该是 video.js 开发人员认为放中间会遮挡内容,所以没放中间。
不过我们常见的一般都在中间,比较符合习惯。
这是可以通过参数修改的,在
像这样:
暂停时显示播放按钮
video.js 在未播放时,会显示一个大的播放按钮,上面我们提到如何让他居中。
那么,如何在视频暂停时也显示这个播放按钮呢?

QQ截图20170308103219.png
有很多用JS的解决办法,感觉都挺麻烦的。
其实用CSS就可以搞定了:
是不是很轻便很简单 :)
播放按钮变○圆形
video.js 默认的播放按钮是圆角矩形,我们一般更熟悉播放按钮为圆形的:

unnamed-file.png
那么怎么改呢?还是用CSS来解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | .video-js .vjs-big-play-button{ font-size: 2.5em; line-height: 2.3em; height: 2.5em; width: 2.5em; -webkit-border-radius: 2.5em; -moz-border-radius: 2.5em; border-radius: 2.5em; background-color: #73859f; background-color: rgba(115,133,159,.5); border-width: 0.15em; margin-top: -1.25em; margin-left: -1.75em; } /* 中间的播放箭头 */ .vjs-big-play-button .vjs-icon-placeholder { font-size: 1.63em; } /* 加载圆圈 */ .vjs-loading-spinner { font-size: 2.5em; width: 2em; height: 2em; border-radius: 1em; margin-top: -1em; margin-left: -1.5em; } |
因为原来居中的时候宽度和高度改变了,所以
禁止在iPhone safari中自动全屏
方法如下,在
1 | <video playsinline ></video> |
注意,在iOS10之前用的是
点击屏幕播放/暂停
这个是视频播放的时候用得较多的功能,用css解决方法如下。
1 2 3 | .video-js.vjs-playing .vjs-tech { pointer-events: auto; } |
进度显示当前播放时间
默认倒序显示时间,也就是视频播放的剩余时间。
要显示当前的播放时间,以及总共视频时长,加2行CSS解决:
1 2 | .video-js .vjs-time-control{display:block;} .video-js .vjs-remaining-time{display: none;} |
重载视频文件
总有那么一些情形,我们需要 video.js 重新载入视频文件。
比如,立即播放刚上传的文件。
例如这样的标签:
1 2 3 4 | <video id="example_video"> <source id="videoMP4" src="1.mp4" /> </video> <button id="reload">重载</button> |
在中,用现成的js方法就可以实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var video = document.getElementById('example_video'); var source = document.getElementById('videoMP4'); $("#reload").click(function() { video.pause() source.setAttribute('src', '2.mp4'); video.load(); video.play(); }); 或者: var video = document.getElementById('example_video'); $("#reload").click(function() { video.pause() video.setAttribute('src', '2.mp4'); video.load(); video.play(); }); |
videojs使用方式就是以类似的方式开始的,不过由于我们借助videojs对视频进行一些控制或制定
1 2 3 4 5 6 7 8 | var player = videojs('example_video_1',{ muted: true, controls : true/false, height:300, width:300, loop : true, // 更多配置..... }); |
常用事件
- 播放 this.play()
- 停止 – video没有stop方法,可以用pause 暂停获得同样的效果
- 暂停 this.pause()
- 销毁 this.dispose()
- 监听 this.on(‘click‘,fn)
- 触发事件this.trigger(‘dispose‘)
1 2 3 4 5 6 7 8 9 10 11 12 13 | var options = {}; var player = videojs(‘example_video_1‘, options, function onPlayerReady() { videojs.log(‘播放器已经准备好了!‘); // In this context, `this` is the player that was created by Video.js.<br> // 注意,这个地方的上下文, `this` 指向的是Video.js的实例对像player this.play(); // How about an event listener?<br> // 如何使用事件监听? this.on(‘ended‘, function() { videojs.log(‘播放结束了!‘); }); }); |
videojs初始化播放器后获得player,在window下,把this挂载到window.player上,就可以用this或player了
1 2 3 4 | videojs("example_video_1", {}, function() { window.Player = this; Player.play(); }); |
场景使用补充
场景1:实时监控
在当需要实时监听视频进度的时候,比如我遇到的场景是课程视频有试听课,只能试听这个视频的前多少分钟。这个时候,不管是普通播放还是拖动进度条都需要实时监听播放的时间进度,判断是否大于试听时间,进行对应操作。
1 2 3 4 5 6 7 8 9 | // 判断试听时间 if(b){ window.loopMarquee = setInterval(function(){ if(player.currentTime() >= listenTime){ player.pause(); $(".gobuy").fadeIn(200); } },500) // 设置每500秒查询一次 } |
场景2: 记录观看历史,下次从上次位置打开
思路:在离开页面时触发得到当前播放时间,存到数据库,下一次加载时从数据库取,如果有history_time则用player.currentTime(historyTime),没有的话,正常从头播放。
1 2 3 | $( window ).unload(function() { getVideoTime(); }); |
常用选项
- autoplay : true/false 播放器准备好之后,是否自动播放 【默认false】
- controls : true/false 是否拥有控制条 【默认true】,如果设为false ,那么只能通过api进行控制了。也就是说界面上不会出现任何控制按钮
- height: 视频容器的高度,字符串或数字 单位像素 比如: height:300 or height:‘300px‘
- width: 视频容器的宽度, 字符串或数字 单位像素
- loop : true/false 视频播放结束后,是否循环播放
- muted : true/false 是否静音
- poster: 播放前显示的视频画面,播放开始之后自动移除。通常传入一个URL
- preload:预加载
‘auto‘ 自动
’metadata‘ 元数据信息 ,比如视频长度,尺寸等
‘none‘ 不预加载任何数据,直到用户开始播放才开始下载 - children: Array | Object 可选子组件 从基础的Component组件继承而来的子组件,数组中的顺序将影响组件的创建顺序哦。
常用方法
- 播放:player.play();
- 暂停:player.pause();
- 获取播放进度:var whereYouAt = player.currentTime();
- 设置播放进度:player.currentTime(120);
- 视频持续时间,加载完成视频才可以知道视频时长,且在flash情况下无效: var howLongIsThis = player.duration();
- 缓冲,就是返回下载了多少: `var whatHasBeenBuffered = player.buffered();
- 百分比的缓冲: var howMuchIsDownloaded = player.bufferedPercent();
- 声音大小(0-1之间): var howLoudIsIt = player.volume();
- 设置声音大小: player.volume(0.5);
- 取得视频的宽度: var howWideIsIt = player.width();
- 设置宽度:player.width(640);
- 获取高度: var howTallIsIt = player.height();
- 设置高度:: player.height(480);
- 一步到位的设置大小:player.size(640,480);
- 全屏: player.enterFullScreen();
- 离开全屏 : player.enterFullScreen();
添加事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | durationchange ended //播放结束 firstplay fullscreenchange loadedalldata loadeddata loadedmetadata loadstart pause //暂停 play //播放 progress seeked seeking timeupdate volumechange waiting resize inherited |
事件绑定
1 2 3 4 5 6 | player.on("ended", function(){ console.log("end", this.currentTime()); }); player.on("pause", function(){ console.log("pause") }); |
删除事件
1 | player.removeEvent(“eventName”, myFunc); |
https://www.jianshu.com/p/3b38f795616f
https://www.jianshu.com/p/9414886a8963
https://www.jianshu.com/p/dca80ecda570
https://blog.csdn.net/a0405221/article/details/80923090
https://www.awaimai.com/2053.html
https://www.cnblogs.com/afrog/p/4115377.html
https://www.cnblogs.com/meelo/p/4304536.html