介绍:兼容性强,开源免费,文档清晰,界面可定制等
使用整理:使用主要针对于移动端视频播放,考虑的点:视频显示适配手机宽度;适配定义样式;在微信端,安卓、ios视频空间控件不同,定制等会自动被微信视频控件覆盖;播放过程中定制暂停/播放按钮事件等;播放结束后定制重播、下一个视频事件,读秒播放下一个视频
html
<video id="videoPlayExecute" class="video-js vjs-default-skin video-label vjs-big-play-centered" controls preload="auto" webkit-playsinline="true" playsinline="true" x5-playsinline poster="./resource/images/test_pic.png" > <source src="https://video.pearvideo.com/head/20190925/cont-1606116-14423410.mp4" type="video/mp4"> </video>自动播放,加一个 autoplay 就可以了,在微信移动端,是不允许视频自动播放
js
var options = { autoplay: false,// 自动播放:true/false controls: true, // 是否显示底部控制栏:true/false aspectRatio: "16:9", // 将播放器置于流体模式下(如“16:9”或“4:3”) loop: false, // 是否循环播放:true/false muted: false, // 设置默认播放音频:true/false preload: "auto", fluid: true, // 是否自适应布局 inactivityTimeout: 0, // 闲置超时 nativeControlsForTouch: false, // 是否使用浏览器原生的控件 language: 'zh-CN', controlBar: { children: [ {name: 'playToggle'}, // 播放按钮 {name: 'currentTimeDisplay'}, // 当前已播放时间 {name: 'progressControl'}, // 播放进度条 {name: 'durationDisplay'}, // 总时间 { name: 'volumePanel', // 音量控制 inline: false, // 不使用水平方式 }, {name: 'FullscreenToggle'} // 全屏 ] } } var myPlayer = videojs('videoPlayExecute', options, function () { // 准备好播放 // 在回调函数中,this代表当前播放器, var myPlayer = this; myPlayer.play(); // 可以调用方法,也可以绑定事件。 myPlayer.on('ended', function () { videoCoverLayer.fadeIn(600); myVideo.hide(); // 播放结束 if (cancelAutoplayHD.val() === '1') { cancelAutoplayBtn.hide(); } else { cancelAutoplayBtn.show(); } playVideoBtn.hide(); replayVideoBtn.show(); nextVideoBtn.show(); countDownNum.html(5); var num = 5; function countDown() { if (num > 0) { num--; countDownNum.html(num); } else { if (cancelAutoplayHD.val() !== '1') { replayVideoBtn.hide(); nextVideoBtn.hide(); cancelAutoplayBtn.hide(); loadNextVideo(relatedFirstVideoUrl) } else { countDownNum.html(5); } clearInterval(timer); } } var timer = setInterval(function () { countDown(); }, 1000); }); // 监听视频播放开始 myPlayer.on("play", function () { // 监听视频播放开始 playVideoBtn.hide(); pauseVideoBtn.hide(); }); // 监听视频播放暂停 myPlayer.on("pause", function () { // 监听视频播放暂停 playVideoBtn.hide(); pauseVideoBtn.hide(); }); });css:修改按钮样式
/* video.js样式修改 */ .video-js { /* 给.video-js设置字体大小以统一各浏览器样式表现,因为video.js采用的是em单位 */ font-size: 14px; } .video-js button { outline: none; } .video-js.vjs-fluid, .video-js.vjs-16-9, .video-js.vjs-4-3 { /* 视频占满容器高度 */ height: 100%; background-color: #161616; } .vjs-poster { background-color: #161616; } .video-js .vjs-big-play-button { /* 中间大的播放按钮 */ font-size: 2.7em; line-height: 1.5em; height: 1.5em; width: 1.5em; -webkit-border-radius: 2.2em; -moz-border-radius: 2.2em; border-radius: 2.2em; background-color: rgba(0, 0, 0, .3); border-width: 0; margin-top: -1em; margin-left: -0.9em; } .video-js.vjs-paused .vjs-big-play-button { /* 视频暂停时显示播放按钮 */ display: block; } .video-js.vjs-error .vjs-big-play-button { /* 视频加载出错时隐藏播放按钮 */ display: none; } .vjs-loading-spinner { /* 加载圆圈 */ font-size: 2em; width: 2em; height: 2em; border-radius: 1em; margin-top: -1em; margin-left: -1.5em; } .video-js .vjs-control-bar { /* 控制条默认显示 */ display: flex; } .video-js .vjs-time-control { display: block; } .video-js .vjs-remaining-time { display: none; } .vjs-button > .vjs-icon-placeholder:before { /* 控制条所有图标,图标字体大小最好使用px单位,如果使用em,各浏览器表现可能会不大一样 */ font-size: 22px; line-height: 1.9; } .video-js .vjs-playback-rate .vjs-playback-rate-value { line-height: 2.4; font-size: 18px; } /* 进度条背景色 */ .video-js .vjs-play-progress { color: #dc0b21; /*background-color: #ffb845;*/ } /*dc0b21*/ .video-js .vjs-progress-control .vjs-mouse-display { /*background-color: #ffb845;*/ } .vjs-mouse-display .vjs-time-tooltip { padding-bottom: 6px; background-color: #dc0b21; } .video-js .vjs-play-progress .vjs-time-tooltip { display: none !important; } /* 控制台背景色 */ .video-js .vjs-control-bar { background-color: rgba(43, 51, 63, .5); }优化是针对option,有些节点是不需要的,但是默认是创建了,所以会影响效率
children : { bigPlayButton : false, textTrackDisplay : false, posterImage: false, errorDisplay : false, controlBar : { captionsButton : false, chaptersButton: false, subtitlesButton:false, liveDisplay:false, playbackRateMenuButton:false } }其他组件:声音,播放按钮,字幕,时间,进度条等等,它们在html中的结构类似于这样子:
Player PosterImage TextTrackDisplay LoadingSpinner BigPlayButton ControlBar PlayToggle FullscreenToggle CurrentTimeDisplay TimeDivider DurationDisplay RemainingTimeDisplay ProgressControl SeekBar LoadProgressBar PlayProgressBar SeekHandle VolumeControl VolumeBar VolumeLevel VolumeHandle MuteToggle更多:https://github.com/videojs/video.js/blob/stable/docs/api/vjs.Player.md
autoplay buffered bufferedEnd bufferedPercent cancelFullScreen deprecated controls currentSrc currentTime currentType dispose //清理 duration ended //结束 error //错误 exitFullscreen //退出全屏 init isFullScreen deprecated 废弃 isFullscreen language load loop //循环 muted 静音 pause 暂停 paused //检测是否暂停的状态 play playbackRate poster //静态图片 preload remainingTime //余下时间 requestFullScreen deprecated requestFullscreen seeking src volume addChild inherited addClass inherited buildCSSClass inherited children inherited contentEl inherited createEl inherited dimensions inherited el inherited enableTouchActivity inherited getChild inherited getChildById inherited hasClass inherited height inherited hide inherited id inherited initChildren inherited name inherited off inherited on inherited one inherited options inherited player inherited ready inherited removeChild inherited removeClass inherited show inherited trigger inherited triggerReady inherited width inheritedhide() 隐藏,show() 显示,play()播放,pause(), el()获取video元素 ,暂停 几本上就差不多了
durationchange ended firstplay fullscreenchange loadedalldata loadeddata loadedmetadata loadstart pause play progress seeked seeking timeupdate volumechange waiting resize inherited以在播放器的控制条中添加一个关闭按钮为例,展示如果使用插件实现我们自己想要的功能。
videojs.PowerOff = videojs.Button.extend({ /* @constructor */ init: function(player, options){ videojs.Button.call(this, player, options); //onClick为默认事件,不需要人为邦定,否则会调两次 //this.on('click', this.onClick); } }); /* This function is called when X button is clicked */ videojs.PowerOff.prototype.onClick = function() { console.log('ddd') //这里添加做你想要干的事情 }; /* Create X button */ var createPowerOffButton = function() { var props = { className: 'vjs-off-button vjs-control', innerHTML: '<div class="vjs-control-content">X</div>', role: 'button', 'aria-live': 'polite', tabIndex: 0 }; return videojs.Component.prototype.createEl(null, props); }; /* Add X button to the control bar */ var X; videojs.plugin('PowerOff', function() { var options = { 'el' : createPowerOffButton() }; X = new videojs.PowerOff(this, options); this.controlBar.el().appendChild(X.el()); });调用的时候,参数要加上插件的名称:
var player = videojs("example_video_1", { plugins : { PowerOff : {} } }, function(){ });给插件按钮加样式,显示到合适的位置
.vjs-default-skin .vjs-control.vjs-off-button { display: block; font-size: 1.5em; line-height: 2; position: relative; top: 0; float:right; left: 10px; height: 100%; text-align: center; cursor: pointer; }总结:对于单页应用,videojs在隐藏时,内部的状态就存在丢失的情况,会导致一系列的问题。解决的办法就是播一次就创建一次。关闭就清理。经测试,这种模式就再也不会有错误了
感谢作者:
https://www.cnblogs.com/Renyi-Fan/p/11626583.html